Computer Science 기본 지식/소켓 프로그래밍 29

논블로킹 소켓 WSA 함수 (TCP / UDP)

논블로킹 소켓으로 비동기 I/O를 하고 싶을 때 사용하는 함수를 정리한다. TCP 관련 - WSAConnect https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaconnect int WSAAPI WSAConnect( SOCKET s, const sockaddr *name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS ); 성공일 때 0 아니면 SOCKET_ERROR s : 접속할 주소에 연결된 소켓을 받기 위한 핸들 name : SOCKADDR 포인터 (접속 주소) namelen : 접속하기 위한 정보 길이 나머지..

[TCP/IP 소켓 프로그래밍] WSACreateEvent()와 WSAEventSelect()

WSAEVENT WSAAPI WSACreateEvent(); WSACreateEvent : 수동 리셋 모드의 이벤트 객체를 반환하며 초기 상태는 비신호 상태이다. 이름이 없기 때문에 자식프로세스에서 상속할 수 없다. WSASetEvent, WSAResetEvent, WSACloseEvent 등으로 이벤트 객체의 신호 발생과 객체 소멸을 발생시킬 수 있다. int WSAAPI WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); 특정 소켓과 WSAEVENT 객체를 연결시키고 소켓에 대한 네트워크 이벤트가 감지되었을 때 해당 이벤트 오브젝트를 신호상태로 만들어준다. lNetworkEvents 인자에 관찰하고자하는 네트워크 이벤트 종류..

[TCP/IP 소켓 프로그래밍] 소켓 옵션 LINGER

setsockopt 함수를 통해 소켓 옵션을 설정할 수 있는데, 그 중 SO_LINGER 옵션을 사용하는 소켓에 대해 알아본다. LINGER 라는 구조체로 옵션을 설정한다. struct linger { u_short l_onoff; /* option on/off */ u_short l_linger; /* linger time */ }; l_onoff : 0보다 큰 수로 설정하면 기존 TCP의 4-way handshaking 정책에 따른 우아한 종료를 실행한다. l_linger : 우아한 종료가 끝날때까지 기다리는 시간을 의미한다. 소켓의 Close이후 소켓의 완전 종료 처리는 커널단에서 진행되며, 블로킹 소켓이라면 블락 상태에서 해당 시간동안 대기하고 논블로킹 소켓의 경우 해당 시간동안 E_WOULDBL..

[게임 서버 프로그래밍 교과서] IOCP 서버

논 블로킹 소켓의 장점 1. 블로킹이 없으므로 중도 취소가 가능하다. 2. 생성하는 스레드 개수가 적고 동시에 많은 소켓을 다룰 수 있다. 3. 연산량이 줄어들고 스레드 개수가 적어지므로 호출 스택 메모리도 낭비되지 않는다. 논 블로킹 소켓의 단점 1. 소켓 I/O 함수가 리턴한 코드가 WOULD_BLOCK인 경우 재시도 호출 낭비가 발생한다. 2. 소켓 I/O 함수를 호출할 때 입력하는 데이터 블록에 대한 복사 연산이 발생한다. 3. 재호출 API가 복잡할 수 있다. 구체적으로 1) 사용자 프로세스에서 소켓 버퍼로의 데이터 복사에 대한 비용과 2) send()와 같은 API 함수 호출 비용(송신 버퍼가 꽉 차있는 경우)이 문제가 될 수 있다. Overlapped I/O 혹은 비동기 I/O Overlap..

[게임 서버 프로그래밍 교과서] Poll을 이용한 논블로킹 서버

다수 클라이언트를 처리하는 논블로킹 소켓을 이용한 서버 예제 -- msdn 참고 POLL_FD 구조체 typedef struct pollfd { SOCKET fd; SHORT events; SHORT revents; } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; fd에 소켓 핸들을 대입 events에는 관찰하고자 하는 I/O에 대한 Flag를 설정한다. revents는 해당 I/O 이벤트 발생시 해당 Flag가 설정되어 있다. Flag Description POLLPRI Priority data may be read without blocking. This flag is not supported by the Microsoft Winsock provider. POLLRDBAND P..

[게임 서버 프로그래밍 교과서] 블로킹 소켓 ManyClient - ManyServer 구조

에코 메세지를 송수신하는 예제 1. 서버는 메인 스레드와 자식 스레드 두 개를 가진다. - 메인 스레드는 에코 메세지를 송신한 이후 할 일이 끝난 RemoteClient 인스턴스를 제거한다. - 자식 스레드는 서버 소켓으로 부터 Accept될 때 마다 RemoteClient를 생성하고 클라이언트 소켓과 에코 메세지를 송신할 작업을 할당한다. 2. Remote Client의 Echo Thread Echo Thread에서는 Receive()를 통해 메세지를 수신하고 다시 메세지를 전송한다. (Echo) 소켓을 닫고 현 작업에 해당하는 RemoteClient를 제거할 준비를 한다. 메인 스레드의 세마포어에 이 사실을 알린다. 3. 에코 이후 Main Thread의 역할 에코 작업이 끝날 때마다 세마포어가 활성..

inet_pton / inet_ntop

ws2tcpip.h에 포함되어 있다. https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_pton inet_pton INT WSAAPI inet_pton( INT Family, PCSTR pszAddrString, PVOID pAddrBuf ); IPv4 혹은 IPv6 주소체계에서 문자열로 표현되는 주소를 실제 이진수에 해당하는 주소로 바꿔주는 함수. 소켓에 주소를 할당할 때, 문자열 주소로 위 함수를 통해 주소를 부여한다. WSAGetLastError로 반환된 오류를 알 수 있다. ex) inet_pton(AF_INET, szInAddress, socekt.sin_addr); inet_ntop PCWSTR WSAAPI..

[TCP/IP 소켓 프로그래밍] (18) IOCP 서버

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 IOCP 서버 Overlapped IO는 입출력 자체를 중첩하여 수행하는 의미이다. IOCP에서는 중첩뿐만아니라 입출력이 완료된 이후 처리를 별도의 쓰레드가 담당하도록 해준다. Completion Port 오브젝트 IOCP에서 완료된 IO의 정보가 Completion Port 오브젝트라는 커널 오브젝트에 등록된다. 어떤 IO의 완료 상황을 처리할 것인가 그것을 트리거하는 주체는 누가될 것인가를 정해야한다. 그 주체는 바로 epoll과 같이 소켓 핸들이며 CP 오브젝트와 연결하여 사용한다. HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, ULONG_PTR Co..

[TCP/IP 소켓 프로그래밍] (17) Overlapped IO 서버

IOCP 서버 모델을 구현하기 앞서 Overlappd IO를 수행하는 Sender와 Receiver로 Overlapped IO 서버를 구현해본다. 리눅스의 epoll과 대비되는 윈도우의 IOCP는 논블로킹 소켓을 기반으로 Overlapped IO 입출력 기능을 사용한다. 논블로킹 모드의 소켓 구성하기 SOCKET hListnSock; int mode = 1; //... hListnSock = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WS_FLAG_OVERLAPPED); ioctlsocket(hLisnSock, FIOBIO, &mode); // for non-blocking socket //... 리눅스에서 epoll의 엣지 트리거 서버를 구현할 때, fcntl(파일 ..

[TCP/IP 소켓 프로그래밍] (16) 비동기 모델 Overlapped IO

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 비동기 Notification IO IO 완료에 대한 알림이 비동기적으로 처리되는 것 IO(입출력)의 중첩(Overlapped) 하나의 쓰레드 내에서 동시에 둘 이상의 영역으로 데이터를 전송함으로 인해서 입출력이 중첩되는 상황을 가리켜 'IO 중첨' 이라 한다. 이러한 일이 가능하려면 기본적으로 IO 입출력 함수는 논블로킹 (바로 반환하는) 함수여야 된다. 위 그림에서 각 소켓 B, C, D을 목적으로하는 출력버퍼를 통해 데이터를 중첩하여 보내는 모델이 Overlapped IO 모델이자 비동기 IO 모델이라 할 수 있다. Overlapped IO 모델의 중점 IO가 비동기적으로 일어나는 점보다 중요한 것은 IO가 완료된 상황을 확인하는 방법에 있다. ..