본문 바로가기
프로그래밍/C

윈도우 소켓 ] blocking / non-blocking 소켓 사용 시 소켓함수의 리턴 조건

by eteo 2023. 12. 24.

 

 

recv()

  • Blocking socket :  수신된 데이터가 없으면 블록되고, MSG_WAITALL 플래그를 사용하면 원하는 크기만큼 도착할 때까지 기다릴 수 있다.
  • Non-blocking socket : 수신된 데이터가 없으면 WSAEWOULDBLOCK으로 즉시 리턴한다. WSAGetLastError() 함수를 사용하여 에러 코드를 확인할 수 있다.
  • TCP / UDP 비교 : 동일하게 Blocking socket에서는 소켓 수신 버퍼에 도착한 데이터가 없으면 블록되고, 소켓 수신 버퍼에 도착한 데이터가 있을 시 이를 응용 프로그램이 제공한 버퍼에 복사한 뒤 리턴한다. 

 

 

send()

  • Blocking socket :  소켓 송신 퍼버에 여유 공간이 없으면 블록되고, 응용 프로그램이 전송 요청한 데이터를 소켓 송신 버퍼에 모두 복사했을 때 리턴한다.
  • Non-blocking socket : 소켓 송신 퍼버에 여유 공간이 아예 없으면 WSAEWOULDBLOCK으로 즉시 리턴하며, 약간의 공간이 있으면, 복사 가능한 만큼 데이터를 복사하고 복사한 데이터의 크기를 반환한다.
  • TCP / UDP 비교 : UDP의 경우 Blocking socket이라고 하더라도 소켓 송신 버퍼를 사용하지 않고 호출 즉시 UDP/IP 스택으로 전달되므로 블록되지 않는다.

 

 

accept()

  • Blocking socket : 클라이언트의 연결 요청이 있을 때까지 블록되고, 클라이언트가 연결을 시도하면 해당 클라이언트와의 연결에 사용되는 새로운 소켓을 생성하고 반환한다.
  • Non-blocking socket: 클라이언트의 연결 요청이 없으면 WSAEWOULDBLOCK으로 즉시 리턴한다.

 

 

connect()

  • Blocking socket : 서버와 연결이 이루어질 때까지(SYN을 보내고 SYN+ACK를 받을 때까지) 블록된다. 서버가 네트워크에 없는 경우 최대 블록 시간은 OS에 따라 다른데 Windows의 경우 21초 정도이다.
  • Nonblocking TCP 소켓: 연결이 진행 중이면 WSAEINPROGRESS가 반환된다.
  • TCP / UDP 비교 : UDP 소켓에서는 connect가 가상의 연결을 만드는 것이기 때문에 즉시 반환한다.

 

 

 

참고 :

https://sthyun.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%95%A8%EC%88%98%EC%9D%98-BlockingNon-Blocking-IO-%EB%8F%99%EC%9E%91

'프로그래밍 > C' 카테고리의 다른 글

C언어 ] qsort (Quick Sort, 퀵정렬) 함수 사용법  (0) 2024.01.30
윈도우 소켓 ] connect() 함수의 타임아웃은 21초  (0) 2023.12.25
IcmpSendEcho  (0) 2023.12.23
strchr, strrchr  (0) 2023.12.22
strpbrk  (0) 2023.12.21