본문 바로가기

TIL/개인공부

[IOCP] 클라이언트 코딩

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "stdafx.h"
#include <WinSock2.h>
 
#pragma comment(lib, "Ws2_32.lib")
 
#define MAX_BUFFER 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 3500
 
struct SOCKETINFO {
    WSAOVERLAPPED overlapped;
    WSABUF dataBuffer;
    int receiveBytes;
    int sendBytes;
};
 
int _tmain(int argc, _TCHAR* argv[]) {
    // winsock.dll 로드
    WSADATA WSAData;
    if (WSAStartup(MAKEWORD(20), &WSAData) != 0) {
        printf("Error - Can not load 'winsock.dll' file\n");
        return 1;
    }
 
    // 서버와 마찬가지로 먼저 소켓 생성 필요
    SOCKET listenSocket = WSASocket(AF_INETSOCK_STREAM0NULL0, WSA_FLAG_OVERLAPPED);
    if (listenSocket == INVALID_SOCKET) {
        printf("Error - Invalid socket\n");
        return 1;
    }
 
    // 서버 정보 객체
    SOCKADDR_IN serverAddr;
    memset(&serverAddr, 0sizeof(SOCKADDR_IN));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(SERVER_PORT);
    serverAddr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP);
 
    // 연결요청 connect
    if (connect(listenSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        printf("Error - Fail to connect\n");
        closesocket(listenSocket);
        WSACleanup();
        return 1;
    }
 
    else {
        printf("Server Connected\n* Enter Message\n->");
    }
 
    SOCKETINFO *socketInfo;
    DWORD sendBytes;
    DWORD receiveBytes;
    DWORD flags;
 
    while (1) {
        char messageBuffer[MAX_BUFFER];
        int i, bufferLen;
        for (i = 01;i++) {
            messageBuffer[i] = getchar();
            if (messageBuffer[i] == '\n') {
                messageBuffer[i++= '\0';
                break;
            }
        }
        bufferLen = i;
 
        socketInfo = (struct SOCKETINFO*)malloc(sizeof(struct SOCKETINFO));
        memset((void*)socketInfo, 0x00sizeof(struct SOCKETINFO));
        socketInfo->dataBuffer.len = bufferLen;
        socketInfo->dataBuffer.buf = messageBuffer;
 
        int sendBytes = send(listenSocket, messageBuffer, bufferLen, 0);
        if (sendBytes > 0) {
            printf("TRACE - Sen message : %s (%d bytes)\n", messageBuffer, sendBytes);
 
            int receiveBytes = recv(listenSocket, messageBuffer, MAX_BUFFER, 0);
            if (receiveBytes > 0) {
                printf("TRACE - Receive message : %s (%d bytes)\n* Enter Message\n->", messageBuffer, receiveBytes);
            }
        }
    }
 
    //소켓 종료
    closesocket(listenSocket);
    WSACleanup();
    return 0;
}
cs


PF_INET은 프로토콜 체계(프로토콜 패밀리), AF_INET은 주소 체계(주소 패밀리)중 하나

 PF_INET

 IPv4 인터넷 프로토콜 

 AF_INET

 IPv4 인터넷 프로토콜

 PF_INET6

 IPv6 인터넷 프로토콜

 AF_INET6

 IPv6 인터넷 프로토콜

 PF_LOCAL

 LOCAL 통신을 위한 UNIX 프로토콜

 AF_LOCAL

 LOCAL 통신을 위한 UNIX 프로토콜 

 PF_PACKET

 Low level socket을 위한 인터페이스

 

 

 PF_IPX

 IPX 노벨 프로토콜

 

 


SOCK_STREAM은 TCP 소켓을 할당할때 상요되는 인자 값

SOCK_DGRAM은 UDP 소켓을 할당할때 사용되는 인자 값


inet_addr(SERVER_IP) 함수란 숫자와 점으로 이루어진 IP 문자열을 LONG형의 숫자 IP주소로 바꾸어 주는 역할


MAKEWORD함수는

WORD MAKEWORD(BYTE bLow, BYTE bHigh)형식으로

bLow: 하위 8비트에 채워질 데이터를 인자로 전달

bHigh: 상위 8비트에 채워질 데이터를 인자로 전달

반응형