반응형
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(2, 0), &WSAData) != 0) { printf("Error - Can not load 'winsock.dll' file\n"); return 1; } // 서버와 마찬가지로 먼저 소켓 생성 필요 SOCKET listenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); if (listenSocket == INVALID_SOCKET) { printf("Error - Invalid socket\n"); return 1; } // 서버 정보 객체 SOCKADDR_IN serverAddr; memset(&serverAddr, 0, sizeof(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 = 0; 1;i++) { messageBuffer[i] = getchar(); if (messageBuffer[i] == '\n') { messageBuffer[i++] = '\0'; break; } } bufferLen = i; socketInfo = (struct SOCKETINFO*)malloc(sizeof(struct SOCKETINFO)); memset((void*)socketInfo, 0x00, sizeof(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비트에 채워질 데이터를 인자로 전달
반응형
'TIL > 개인공부' 카테고리의 다른 글
[2018 데이터챌린지] 악성코드 탐지 후기 2편 (0) | 2018.11.11 |
---|---|
[2018 데이터챌린지] 악성코드 탐지 후기 1편 (0) | 2018.11.11 |
[IOCP] 서버 코딩 연습 (0) | 2018.09.17 |
공부2 (0) | 2018.09.14 |
[Tensorflow]우분투에 Tensorflow-gpu 버전 설치하기. 2 (0) | 2018.03.19 |