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를 계속 갉아먹는다.
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 |