본문으로 바로가기

[네퓨즈 수업] 소켓통신

category 네퓨즈 수업 2016. 4. 12. 18:12

소켓 server.cpp

(아래 코드의 주석은 필자가 이해한대로 해석한 것입니다.)

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
#include <stdio.h>
#include <WinSock2.h> // 윈도우의 내장된 소케
#pragma comment(lib, "ws2_32.lib"// 헤더를 사용하기위한라이브러리
 
int main()
{
    WSADATA wsaData;
    SOCKET servSock, clntSock;
    SOCKADDR_IN servAddr, clntAddr;
 
    char msg[] = "Hello!";
    char buf[128];
    int szClntAddr = sizeof(clntAddr);
 
    WSAStartup(MAKEWORD(22), &wsaData); // 원속초기화
 
    servSock = socket(PF_INET, SOCK_STREAM, 0); // 소켓 생성
 
    // 서버측 주소 설정
    memset(&servAddr, 0sizeof(servAddr)); // 소켓의 주소초기화
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(ADDR_ANY); // 서버에서 어떤 주소를 받을지 입력(모든 클라이언트가 받을 수 있게)
    servAddr.sin_port = htons(55555); // 포트번호 설정
 
    // 서버 소켓 할당
    bind(servSock, (SOCKADDR*)&servAddr, sizeof(servAddr)); // 소켓주소를 할당
 
    // 클라이언트 요청 대기
    listen(servSock, 5);
 
    // 클라이언트 요청 수락 및 클라이언트 소켓 설정
    clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &szClntAddr);
 
    // 데이터 교환
    send(clntSock, msg, sizeof(msg), 0); // 데이터를보냄
    recv(clntSock, buf, sizeof(buf), 0); // 데이터를받음
    printf("%s\n", buf); //받은것을 출력
 
    // 소켓 닫기
    closesocket(clntSock); // 클라이언트 소켓을 닫는다고 말해줌 (*순서에 주의하자)
    closesocket(servSock);
 
    // 윈속 닫기
    WSACleanup();
 
    return 0;
}
cs


소켓 clinet.cpp

(아래 코드의 주석은 필자가 이해한대로 해석한 것입니다.)

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
#include <stdio.h>
#include <WinSock2.h> // 윈도우의 내장된 소켓
#pragma comment(lib, "ws2_32.lib"// 헤더를 사용하기위한 라이브러리
 
int main()
{
    WSADATA wsaData;
    SOCKET sock; // 서버와 다르게 자신이 연결할것 하나만 있으면된다.
    SOCKADDR_IN sockAddr;
 
    char ipAddr[20];
    char msg[] = "Hello!";
    char buf[128];
    int szSockAddr = sizeof(sockAddr);
 
    // 윈속 초기화
    WSAStartup(MAKEWORD(22), &wsaData);
 
    // 소켓 생성
    sock = socket(PF_INET, SOCK_STREAM, 0);
 
    printf("서버 아이피 주소 : ");
    scanf("%s", ipAddr);
 
    // 소켓 주소 설정
    memset(&sockAddr, 0sizeof(sockAddr));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = inet_addr(ipAddr); // 서버와다르게 모든 주소를 받게하면 안된다.
    sockAddr.sin_port = htons(55555);
 
    // 서버에 연결 요청
    connect(sock, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
 
    // 데이터 교환
    recv(sock, buf, sizeof(buf), 0); // 받고
    printf("%s\n", buf); // 받은것을 출력
    send(sock, msg, sizeof(msg), 0); // 보낸다
 
    // 소켓 닫기
    closesocket(sock);
 
    // 윈속 닫기
    WSACleanup();
 
    return 0;
}
cs