Overlapped I/O 전용 송수신 함수를 호출하면 운영체제는 송신할 데이터가 저장되어 있는 메모리 블록 자체를 송신 버퍼로 사용해 버립니다. 수신을 할 때도 마찬가지입니다. 수신할 데이터가 있으면 수신 버퍼에 일단 온 후에는 여러분 수신 데이터 블록에 복사되지 않습니다. 즉시 여러분 수신 데이터 블록에 수신 데이터가 쌓이게 됩니다. 엄청나죠?
Overlapped I/O는 윈도 전용으로 작동하는 것으로 리눅스나 여타 운영체제에서는 찾아보기 어렵습니다. 표 3-1은 윈도에서 제공하는 Overlapped I/O 전용 함수입니다.
▼ 표 3-1 윈도에서 제공하는 Overlapped I/O 전용 함수
일반 버전 함수 |
Overlapped I/O 전용 함수 |
send |
WSASend |
sendto |
WSASendTo |
recv |
WSARecv |
recvfrom |
WSARecvFrom |
connect |
ConnectEx |
accept |
AcceptEx |
MSDN에서 함수 이름으로 검색하면 자세한 설명을 볼 수 있습니다. 하지만 AcceptEx() 같은 함수는 그 사용 방법부터가 쉽지 않습니다. 우선 AcceptEx의 함수 포인터를 얻어 와야 하는데, AcceptEx를 호출하는 것이 Overlapped accept입니다. 그리고 accept를 할 때 넣었던 Overlapped status 객체에 대해 GetOverlappedResult가 ‘완료했음’이라고 한다면, setsockopt(SO_UPDATE_ACCEPT_CONTEXT)를 이용해서 새 소켓 핸들 값을 얻어 와야 합니다. ConnectEx도 함수 포인터를 얻어 오는 등 독특한 사용 방법을 따라야 합니다. 자세한 것은 Microsoft Docs(https://docs.microsoft.com)에서 해당 함수 도움말을 살펴보기 바랍니다.