달력

5

« 2024/5 »

  • 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

윈도우 운영 체제를 기반으로 간단한 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(22), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }
 
    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if (hServSock == INVALID_SOCKET){
        ErrorHandling("socket() error");
    }
 
    memset(&servAddr, 0sizeof(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(22), &wsaData) != 0)
        ErrorHandling("WSAStartup() error!");
 
    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if (hSocket == INVALID_SOCKET)
        ErrorHandling("hSocketet() error");
 
    memset(&servAddr, 0sizeof(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) - 10);
    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! 라는 메세지가 뜬다.


:
Posted by youjin.A