Share via


겹치는 I/O 및 이벤트 개체

Windows Sockets 2는 겹치는 I/O를 지원하며 모든 전송 공급자는 이 기능을 지원합니다. 겹치는 I/O는 Windows에 설정된 모델을 따르며, dwFlags 매개 변수에 설정된 WSA_FLAG_OVERLAPPED 플래그를 사용하여 WSASocket 함수로 만든 소켓 함수 또는 소켓으로 만든 소켓에서 수행할 수 있습니다.

참고

겹치는 특성을 사용하여 소켓을 만드는 것은 소켓이 현재 차단 모드인지 비블로킹 모드인지에 영향을 주지 않습니다. 겹치는 특성으로 만든 소켓은 겹치는 I/O를 수행하는 데 사용할 수 있습니다. 이렇게 하면 소켓의 차단 모드가 변경되지 않습니다. 겹치는 I/O 작업은 차단되지 않으므로 소켓의 차단 모드는 이러한 작업과 관련이 없습니다.

 

수신을 위해 애플리케이션은 WSARecv 또는 WSARecvFrom 함수를 사용하여 데이터를 받을 버퍼를 제공합니다. 네트워크에서 데이터를 수신한 시간 이전에 하나 이상의 버퍼가 게시되면 해당 데이터가 도착하는 즉시 사용자의 버퍼에 배치될 수 있습니다. 따라서 recv 또는recvfrom 함수가 호출될 때 발생하는 복사 작업을 방지할 수 있습니다. 수신 버퍼가 게시될 때 데이터가 이미 있는 경우 사용자의 버퍼에 즉시 복사됩니다.

애플리케이션에서 수신 버퍼를 게시하지 않은 경우 데이터가 도착하면 네트워크는 익숙한 동기 작업 스타일에 의존합니다. 즉, 들어오는 데이터는 애플리케이션이 수신 호출을 발급하여 데이터를 복사할 수 있는 버퍼를 제공할 때까지 내부적으로 버퍼링됩니다. 이에 대한 예외는 애플리케이션이 setsockopt 를 사용하여 수신 버퍼의 크기를 0으로 설정하는 경우입니다. 이 instance 신뢰할 수 있는 프로토콜은 애플리케이션 버퍼가 게시되고 신뢰할 수 없는 프로토콜의 데이터가 손실될 때만 데이터를 수신할 수 있도록 허용합니다.

송신 쪽에서 애플리케이션은 WSASend 또는 WSASendTo 를 사용하여 채워진 버퍼에 대한 포인터를 제공한 다음 네트워크에서 버퍼의 콘텐츠를 소비할 때까지 버퍼를 방해하지 않는 데 동의합니다.

겹치는 송신 및 수신 호출은 즉시 반환됩니다. 반환 값이 0이면 I/O 작업이 즉시 완료되었으며 해당 완료 표시가 이미 발생했음을 나타냅니다. 즉, 연결된 이벤트 개체에 신호가 전송되었거나 완료 루틴이 큐에 대기되고 호출 스레드가 경고 대기 상태로 전환될 때 실행됩니다.

WSA_IO_PENDING 오류 코드와 결합된 SOCKET_ERROR 반환 값은 겹치는 작업이 성공적으로 시작되었으며 송신 버퍼가 사용되었거나 수신 작업이 완료되었을 때 후속 표시가 제공됨을 나타냅니다. 그러나 바이트 스트림 스타일인 소켓의 경우 버퍼가 가득 찼는지 여부에 관계없이 들어오는 데이터가 소진될 때마다 완료 표시가 발생합니다. 다른 오류 코드는 겹치는 작업이 성공적으로 시작되지 않았으며 완료 표시가 나오지 않음을 나타냅니다.

보내기 및 수신 작업은 둘 다 겹칠 수 있습니다. 수신 데이터를 준비하기 위해 수신 버퍼를 게시하기 위해 수신 함수를 여러 번 호출할 수 있으며 보내기 함수를 여러 번 호출하여 보낼 여러 버퍼를 큐에 대기할 수 있습니다. 애플리케이션은 제공된 순서대로 전송되는 일련의 겹치는 송신 버퍼를 사용할 수 있지만 해당 완료 표시는 다른 순서로 발생할 수 있습니다. 마찬가지로 수신 쪽에서 버퍼는 제공된 순서대로 채워질 수 있지만 완료 표시는 다른 순서로 발생할 수 있습니다.

대부분의 경우 AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile 및 유사한 함수를 사용하는 Winsock 겹치는 작업은 취소할 수 있습니다. 그러나 미해결 작업을 취소한 소켓의 지속적인 사용에 대한 동작은 정의되지 않습니다. 겹치는 작업을 취소한 후 closesocket 함수를 호출해야 합니다. 따라서 최상의 결과를 위해 I/O를 직접 취소하는 대신 closesocket 함수를 호출하여 소켓을 닫아야 하며 결국 보류 중인 모든 작업이 중단됩니다.

겹치는 I/O의 지연된 완료 기능은 향상된 버전의 ioctlsocketWSAIoctl에서도 사용할 수 있습니다.