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가 가상의 연결을 만드는 것이기 때문에 즉시 반환한다.
참고 :
'프로그래밍 > 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 |