Server/C++

논블로킹 소켓 (Non-Blocking Socket)

Juzdalua 2024. 8. 7. 00:39

TCP 통신에서 블로킹 소켓은 특정 조건이 만족될 때까지 대기하는 소켓이다.

블로킹 소켓(Blocking Socket)
accept -> 접속한 클라가 있을 때
connect -> 서버 접속 성공했을 때
send, sendto -> 요청한 데이터를 송신버퍼에 복사했을 때
recv, recvfrom -> 수신버퍼에 도착한 데이터가 있고, 이를 유저레벨 버퍼에 복사했을 때

 

논블로킹 소켓은 블로킹소켓에서 대기하는 일들을 없애주는 소켓이다

하지만 논블로킹 소켓이 블로킹 소켓보다 언제나 효율적이지는 않다.

 

ioctlsocket

u_long on = 1;
if (ioctlsocket(listenSocket, FIONBIO, &on) == INVALID_SOCKET)
	return 0;

WSAEWOULDBLOCK

논블로킹 소켓에서는 각 함수의 지점마다 INVALID_SOCKET(0), SOCKET_ERROR(-1)에서 WSAEWOULDBLOCK 에러가 발생하는데, 이는 치명적 에러가 아닌 논블로킹 특성상 발생하는 일시적 에러이다.

따라서 해당 에러가 발생했을 경우, 이를 무시하고 반복문을 통해 다시 연결해야한다.

루프의 반복으로 CPU를 계속 갉아먹는다.

msdn socket error code

accept
 - 클라이언트의 연결 요청을 받지 못함

closesocket
 - SO_LINGER옵션에 타임아웃

connect
 - 아직 연결 진행 중이다.

recv
 - 데이터 아직 못받음 -> recvBuffer가 비어있는 상태

send
 - 전송할 버퍼 공간 없음. 나중에 다시 시도.
 - 상대방 recvBuffer 공간이 부족할 때

이를 해결하기 위한 방법으로 여러가지 소켓 모델들이 있는데, 다음 글에서 알아보겠다.

 

https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2

 

Windows Sockets Error Codes (Winsock2.h) - Win32 apps

Windows Sockets (Winsock) error codes returned by the WSAGetLastError function.

learn.microsoft.com

 

코드)

https://github.com/Juzdalua/study-cpp/blob/main/Study/TCP-NonBlocking-SocketServer.cpp

 

study-cpp/Study/TCP-NonBlocking-SocketServer.cpp at main · Juzdalua/study-cpp

Study C++. Contribute to Juzdalua/study-cpp development by creating an account on GitHub.

github.com

 

'Server > C++' 카테고리의 다른 글

WSAEventSelect 모델  (0) 2024.08.10
Select 모델  (0) 2024.08.07
Socket option  (0) 2024.08.06
UDP 소켓 프로그래밍  (0) 2024.08.06
TCP vs UDP  (0) 2024.08.06