본문 바로가기

소켓 프로그래밍/서버와 클라이언트

* Iterative 서버

https://developer-jun.tistory.com/11

위의 과정에서 Hello World 서버 프로그램을 구현해보았다. 그렇지만 클라이언트가 한 번 접속한 후 바로 종료가 되어버린다. 이러한 서버는 우리가 생각한 서버가 아니다. 위의 과정에서는 어떤식으로 서버와 클라이언트가 데이터를 송수신하는지 배워왔다. 이번에는 클라이언트가 여러번 접속을 하여도 종료가 되지않는 서버를 배워보자.

반복적인(Iterative) 서버 흐름도

위의 흐름도를 살펴보면 적절한 송수신 이후 클라이언트의 연결을 종료한 후 accept() 함수를 호출하기 전으로간 후 루프문을 돌리고 있다. 이것이 핵심이다.

아래의 코드를 보자. 클라이언트 코드는 Hello World 서버의 코드와 동일하기 때문에 그대로 사용하면 된다.

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
#include <iostream>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")
 
using namespace std;
 
int main()
{
    // 윈속 초기화
    WSADATA wsaData = {};
    if (WSAStartup(MAKEWORD(22), &wsaData) != 0)
    {
        cout << "WSAStartup() Error" << endl;
        return -1;
    }
 
    // 서버 소켓 생성
    SOCKET servSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (servSocket == INVALID_SOCKET)
    {
        cout << "socket() Error" << endl;
        return -1;
    }
 
    // 소켓에 주소 할당
    SOCKADDR_IN sockAddr = {};
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(4000);
    sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(servSocket, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR_IN)) == -1)
    {
        cout << "bind() Error" << endl;
        return -1;
    }
 
    // 연결 요청 대기 상태
    listen(servSocket, SOMAXCONN);
    
    while (true)
    {
        // 연결 요청 수락
        SOCKADDR_IN tClntAddr = {};
        int size = sizeof(SOCKADDR_IN);
        SOCKET clntSocket = accept(servSocket, (SOCKADDR*)&tClntAddr, &size);
        if (clntSocket == SOCKET_ERROR)
        {
            closesocket(servSocket);
            WSACleanup();
        }
 
        // 데이터 전송
        char message[] = "Hello World! \n";
        send(clntSocket, message, sizeof(message), 0);
 
        // 클라이언트 연결 종료
        closesocket(clntSocket);
    }
    
    // 서버 연결 종료
    closesocket(servSocket);
 
    // 윈도우 소켓 해제
    WSACleanup();
}
cs

'소켓 프로그래밍 > 서버와 클라이언트' 카테고리의 다른 글

2) 에코 서버  (0) 2020.07.14
* TCP / IP 4계층  (0) 2020.07.13
* 바이트 순서  (0) 2020.07.09
* 주소 체계와 데이터 설정  (0) 2020.07.08
* 소켓의 생성과 프로토콜  (0) 2020.07.08