윈도우 기반 서버, 클라이언트 Hello World! 전자공학이론/데이터 통신2015. 9. 16. 17:58
윈도우 운영 체제를 기반으로 간단한 TCP/IP 소켓통신을 구현해 보았다.
ws2_32.lib 라이브러리를 링크
윈도우 기반의 소켓을 '윈속'이라고 하는데 이를 개발 하기위해서는 헤더파일 <winsock2.h>를 포함시켜야 한다.
이것을 포함시키기 위해서는 ws2_32.lib 라이브러리를 링크시켜야 한다.
현재 Visual studio 2013을 사용하고 있는데 2008으로도 가능하다는 것으로 봐서 다른 버전에서도 그대로 적용 가능한 것 같다.
ws2_32.lib 라이브러리를 링크시키기 위해서는 Project>properties>Linker>Input>Additional Dependencies에 ws2_32.lib를 적고 적용시킨다.
다음으로 server와 client 프로젝트를 각각 열고 코드를 입력한다.
server 코드
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 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h> void ErrorHandling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } int main(int argc, char ** argv) { WSADATA wsaData; SOCKET hServSock; SOCKET hClntSock; SOCKADDR_IN servAddr; SOCKADDR_IN clntAddr; int szClntAddr; char message[] = "Hello World! \n"; if (argc != 2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){ ErrorHandling("WSAStartup() error!"); } hServSock = socket(PF_INET, SOCK_STREAM, 0); if (hServSock == INVALID_SOCKET){ ErrorHandling("socket() error"); } memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(atoi(argv[1])); if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR){ ErrorHandling("bind() error"); } if (listen(hServSock, 5) == SOCKET_ERROR){ ErrorHandling("listen() error"); } szClntAddr = sizeof(clntAddr); hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr); if (hClntSock == INVALID_SOCKET){ ErrorHandling("accept() error"); } send(hClntSock, message, sizeof(message), 0); closesocket(hClntSock); closesocket(hServSock); WSACleanup(); return 0; } | cs |
client 코드
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 | #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h> void ErrorHandling(char* message); int main(int argc, char ** argv) { WSADATA wsaData; SOCKET hSocket; char message[30]; int strLen; SOCKADDR_IN servAddr; if (argc != 3){ printf("Usage: %s <IP> <port>\n", argv[0]); exit(1); } if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error!"); hSocket = socket(PF_INET, SOCK_STREAM, 0); if (hSocket == INVALID_SOCKET) ErrorHandling("hSocketet() error"); memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = inet_addr(argv[1]); servAddr.sin_port = htons(atoi(argv[2])); if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("connet() error!"); strLen = recv(hSocket, message, sizeof(message) - 1, 0); if (strLen == -1) ErrorHandling("read() error!"); message[strLen] = 0; printf("Message from server : %s \n", message); closesocket(hSocket); WSACleanup(); return 0; } void ErrorHandling(char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } | cs |
server 실행하기
project에 마우스 오른쪽> Properties>Debugging>Command Argument 에 포트번호를 적는다. 9190
그 다음 server프로젝트를 빌드하고 디버깅하면 다음과 같이 뜬다.
client 실행하기
client도 마찬가지로 project에 마우스 오른쪽> Properties>Debugging>Command Argument 에 들어간다.
Command Argument 에 다가 server의 ip주소, 포르번호를 적는다.
지금은 server와 client 둘 다 내컴퓨터이니까 Command Argument에 127.0.0.1 9190 이라고 적는다.
그리고 client 프로젝트를 빌드하고 디버깅하면 server 프로세스에서 보낸 Hello world! 라는 메세지가 뜬다.
'전자공학이론 > 데이터 통신' 카테고리의 다른 글
[physical Layer] 네트워크의 물리적 성능 (0) | 2015.10.20 |
---|---|
[physical Layer] 신호 왜곡 원인 (0) | 2015.10.20 |
[Network model] Layered tasks (0) | 2015.10.20 |
[Network model] Interconnection of Networks (0) | 2015.10.20 |
IP 유틸리티들 (0) | 2015.09.16 |