본문 바로가기
SWE/네트워크

소켓 통신 프로그래밍 socket | 논블로킹 poll 테스트 코드

by S나라라2 2022. 9. 13.
반응형

 

한 번 보면 잊을 수 없는 짤

비동기는 커피 진동벨, 외우자

비동기는 준비되면 알려드릴게요~ 

출처: 한빛미디어 boost.asio를 이용한 네트워크 프로그래밍

소켓의 동작 모드

  • Blocking

- 블러킹 모드의 소켓이란 네트워크 시스템이 실행을 완료할 때까지 응용프로그램의 프로세스가 블러킹 되는 소켓이다.

- 예를 들면 accept()는 실행을 완료할 때(커넥션이 있을 때)까지까지 호출한 클래스를 블러킹하고 있는다.

- 전통적인 unix 시스템 콜들은 모두 blocking이다. (listen, accept, connect, send, recv, close 등) 

  • NonBlocking

- 비블로킹 모드의 소켓이란 일단 결과를 바로 반환해서, 응용 프로그램의 프로세스가 차단되지 않는 소켓을 말한다.

  • Asynchronous

- 비동기 모드는 비블로킹 모드에서처럼 차단될 수 있었던 소켓 관련 시스템 콜에 대해서 일단 반환을 하고, 해당 실행이 완료되면 비동기적으로(Asynchronously) 결과를 응용 프로그램에게 알려준다.  

 

 

 

소켓 서버 비블로킹 모드로 구현

서버는 다수의 클라이언트로부터 오는 많은 종류의 이벤트에 반응할 수 있도록 '항시 대기'여야 한다. 예를 들어 새로운 커넥션이 들어올 수도 있고, 클라이언트가 우리에게 요청을 보낼 수도 있고, 클라이언트가 연결을 끊을 수도 있다.

그런데 서버가 accept()를 호출해야 한다면, 이 호출은 프로그램을 블럭시킬 것이고, 서버는 다른 이벤트에 응답하는 능력을 잃게 된다. 

이런 문제에 대한 전통적인 해결법이 unix의 select() api를 사용하는 것이다.

 

 

Select()

- synchronous I/O multiplexing

- select()를 사용하면 프로세스는 커널에게 소켓(file descriptor)이 "ready"될 때 알려달라고 할 수 있다. 그러면 커널은 file descriptor가 I/O 동작을 할 수 있는 상태가 되면 프로세스를 깨워줌. 

 

 

Poll()

poll() api : UNIX 95/98 표준, poll()은 select() 의 모든 기능을 대체하는 더 최신의 시스템 콜이므로, poll로 설명하겠다.

#include <sys/poll.h> // poll()


constexpr int POLL_FAILED = -1;
constexpr int POLL_TIMEOUTED = 0;

constexpr int TIME_OUT = 0.1*1000; // 0.1sec


struct pollfd fd_;
fd_.fd = // file descriptor. Created a socket using socket() api.
fd_.events = POLLIN;
fd_.revents = 0;

while (1) {
        int rc = poll(&fd_, 1, TIME_OUT);
        if ( rc == POLL_FAILED ) {
            exit(1);
        }else if ( rc == POLL_TIMEOUTED ) {
            continue;
        }
        // The return value of poll() is 1++ : Multiple descriptors are waiting to be processed.
        // Do Tasks : receive()
    }

 

 

 

도움되는 사이트들

Using poll() instead of select() - IBM Documentation

Asynchronous programming. Blocking I/O and non-blocking I/O - Blog | luminousmen

Beej's Guide to Network Programming

https://docs.microsoft.com/ko-kr/windows/win32/winsock/complete-client-code

반응형