LPFN_RIOSEND 콜백 함수(mswsock.h)
RIOSend 함수는 Winsock 등록 I/O 확장에 사용하기 위해 연결된 등록된 I/O TCP 소켓 또는 바인딩된 등록된 I/O UDP 소켓에 네트워크 데이터를 보냅니다.
구문
LPFN_RIOSEND LpfnRiosend;
BOOL LpfnRiosend(
RIO_RQ SocketQueue,
PRIO_BUF pData,
ULONG DataBufferCount,
DWORD Flags,
PVOID RequestContext
)
{...}
매개 변수
SocketQueue
연결된 등록된 I/O TCP 소켓 또는 바인딩된 등록된 I/O UDP 소켓을 식별하는 설명자입니다.
pData
데이터를 보낼 등록된 버퍼 부분에 대한 설명입니다.
애플리케이션이 UDP 데이터그램에 데이터 페이로드를 보낼 필요가 없는 경우 이 매개 변수는 바인딩된 등록된 I/O UDP 소켓에 대해 NULL일 수 있습니다.
DataBufferCount
pData 매개 변수가 가리키는 버퍼에서 데이터를 보낼 것인지를 나타내는 데이터 버퍼 수 매개 변수입니다.
pData가 NULL인 경우 이 매개 변수를 0으로 설정해야 합니다. 그렇지 않으면 이 매개 변수를 1로 설정해야 합니다.
Flags
RIOSend 함수의 동작을 수정하는 플래그 집합입니다.
Flags 매개 변수는 헤더 파일에 정의된 다음 옵션의 조합을 포함할 Mswsockdef.h
수 있습니다.
RIO_MSG_COMMIT_ONLY
RIO_MSG_DEFER 플래그와 함께 추가된 이전 요청이 커밋됩니다.
RIO_MSG_COMMIT_ONLY 플래그를 설정하면 다른 플래그를 지정할 수 없습니다. RIO_MSG_COMMIT_ONLY 플래그가 설정되면 pData 및 RequestContext 인수는 NULL이어야 하며 DataBufferCount 인수는 0이어야 합니다.
이 플래그는 일반적으로 RIO_MSG_DEFER 플래그 집합과 함께 여러 요청을 실행한 후에 가끔 사용됩니다. 이렇게 하면 RIO_MSG_DEFER 플래그를 사용하여 RIO_MSG_DEFER 플래그 없이 마지막 요청을 수행할 필요가 없으므로 마지막 요청이 다른 요청보다 훨씬 느리게 완료됩니다.
RIOSend 함수에 대한 다른 호출과 달리 RIO_MSG_COMMIT_ONLY 플래그가 설정되면 RIOSend 함수에 대한 호출을 serialize할 필요가 없습니다. 단일 RIO_RQ 경우 다른 스레드에서 RIOSend 함수를 호출하는 동안 한 스레드에서 RIO_MSG_COMMIT_ONLY사용하여 RIOSend 함수를 호출할 수 있습니다.
RIO_MSG_DONT_NOTIFY
요청 완료가 완료 큐에 삽입될 때 요청이 RIONotify 함수를 트리거해서는 안 됩니다.
RIO_MSG_DEFER
요청을 즉시 실행할 필요는 없습니다. 그러면 요청 큐에 요청이 삽입되지만 요청 실행을 트리거하거나 트리거하지 않을 수 있습니다.
RIO_MSG_DEFER 플래그 집합 없이 SocketQueue 매개 변수에 전달된 RIO_RQ 전송 요청이 이루어질 때까지 데이터 전송이 지연될 수 있습니다. 보내기 큐의 모든 송신에 대한 실행을 트리거하려면 RIO_MSG_DEFER 플래그 집합 없이 RIOSend 또는 RIOSendEx 함수를 호출합니다.
참고
송신 요청은 RIO_MSG_DEFER 설정되었는지 여부에 관계없이 SocketQueue 매개 변수에 전달된RIO_RQ 미해결 I/O 용량에 대해 청구됩니다.
RequestContext
반환 값
오류가 발생하지 않으면 RIOSend 함수는 TRUE를 반환합니다. 이 경우 보내기 작업이 성공적으로 시작되고 완료가 이미 큐에 대기되었거나 작업이 성공적으로 시작되었으며 나중에 완료가 큐에 대기됩니다.
FALSE 값은 함수가 실패하고 작업이 성공적으로 시작되지 않았으며 완료 표시가 큐에 대기되지 않음을 나타냅니다. WSAGetLastError 함수를 호출하여 특정 오류 코드를 검색할 수 있습니다.
반환 코드 | 설명 |
---|---|
WSAEFAULT | 시스템이 호출에서 포인터 인수를 사용하려는 시도에서 잘못된 포인터 주소를 발견했습니다. 이 오류는 버퍼 식별자가 등록 취소되거나 작업이 큐에 대기되거나 호출되기 전에 매개 변수에 전달된 RIO_BUF 구조체에 대해 버퍼가 해제된 경우 반환됩니다. |
WSAEINVAL | 잘못된 매개 변수가 함수에 전달되었습니다. SocketQueue 매개 변수가 유효하지 않거나 Flags 매개 변수에 보내기 작업에 유효하지 않은 값이 포함되어 있거나 완료 큐의 무결성이 손상된 경우 이 오류가 반환됩니다. 매개 변수와 관련된 다른 문제에 대해서도 이 오류를 반환할 수 있습니다. |
WSAENOBUFS | 충분한 메모리를 할당할 수 없습니다. 이 오류는 SocketQueue 매개 변수와 연결된 I/O 완료 큐가 가득 차거나 전송 항목이 0개인 I/O 완료 큐를 만든 경우 반환됩니다. |
WSA_IO_PENDING | 작업이 성공적으로 시작되었으며 나중에 완료가 큐에 대기됩니다. |
설명
애플리케이션은 RIOSend 함수를 사용하여 등록된 단일 버퍼 내에 완전히 포함된 모든 버퍼에서 네트워크 데이터를 보낼 수 있습니다. pData 매개 변수가 가리키는 RIO_BUF 구조체의 Offset 및 Length 멤버는 버퍼에서 보낼 네트워크 데이터를 결정합니다.
보내기 작업과 연결된 버퍼는 다른 송신 또는 수신 작업과 동시에 사용해서는 안 됩니다. 버퍼 및 버퍼 등록은 보내기 작업 기간 동안 유효한 상태로 유지되어야 합니다. 즉, 이미 보류 중인 경우 동일한 PRIO_BUF RIOSend(Ex) 요청에 전달해서는 안 됩니다. 진행 중인 RIOSend(Ex) 요청이 완료된 후에만 동일한 PRIO_BUF 다시 사용해야 합니다(오프셋이 동일하거나 오프셋과 길이가 다른 경우). 또한 전송 데이터가 등록된 버퍼(부분 또는 전체 버퍼)를 참조하는 경우 전송이 완료될 때까지 등록된 전체 버퍼를 사용하면 안 됩니다. 여기에는 수신 작업 또는 다른 보내기 작업에 등록된 버퍼의 일부를 사용하는 것이 포함됩니다.
Flags 매개 변수를 사용하여 연결된 소켓에 대해 지정된 옵션 외에 RIOSend 함수의 동작에 영향을 줄 수 있습니다. 이 함수의 동작은 SocketQueue 매개 변수와 연결된 소켓에 설정된 소켓 옵션과 Flags 매개 변수에 지정된 값의 조합에 따라 결정됩니다.
참고
RIOSend 함수에 대한 함수 포인터는 지정된 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 가져와야 합니다. WSAIoctl 함수에 전달된 입력 버퍼에는 값이 Winsock 등록 I/O 확장 함수를 식별하는 GUID(Globally Unique Identifier)인 WSAID_MULTIPLE_RIO 포함되어야 합니다. 성공하면 WSAIoctl 함수에서 반환된 출력에는 Winsock 등록 I/O 확장 함수에 대한 포인터가 포함된 RIO_EXTENSION_FUNCTION_TABLE 구조체에 대한 포인터가 포함됩니다. SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL은 Ws2def.h 헤더 파일에 정의되어 있습니다. WSAID_MULTIPLE_RIO GUID는 Mswsock.h 헤더 파일에 정의되어 있습니다.
Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
요구 사항
요구 사항 | 값 |
---|---|
헤더 | mswsock.h |