Connection-Oriented 소켓을 통해 데이터 보내기
Winsock Kernel(WSK) 애플리케이션이 연결 지향 소켓을 원격 전송 주소에 연결한 후 소켓을 통해 데이터를 보낼 수 있습니다. WSK 애플리케이션은 수신 대기 소켓에서 수락한 연결 지향 소켓을 통해 데이터를 보낼 수도 있습니다. WSK 애플리케이션은 WskSend 함수를 호출하여 연결 지향 소켓을 통해 데이터를 보냅니다.
다음 코드 예제에서는 WSK 애플리케이션 연결 지향 소켓을 통해 데이터를 보낼 수 있는 방법을 보여 줍니다.
// Prototype for the send IoCompletion routine
NTSTATUS
SendComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
);
// Function to send data
NTSTATUS
SendData(
PWSK_SOCKET Socket,
PWSK_BUF DataBuffer
)
{
PWSK_PROVIDER_CONNECTION_DISPATCH Dispatch;
PIRP Irp;
NTSTATUS Status;
// Get pointer to the provider dispatch structure
Dispatch =
(PWSK_PROVIDER_CONNECTION_DISPATCH)(Socket->Dispatch);
// Allocate an IRP
Irp =
IoAllocateIrp(
1,
FALSE
);
// Check result
if (!Irp)
{
// Return error
return STATUS_INSUFFICIENT_RESOURCES;
}
// Set the completion routine for the IRP
IoSetCompletionRoutine(
Irp,
SendComplete,
DataBuffer, // Use the data buffer for the context
TRUE,
TRUE,
TRUE
);
// Initiate the send operation on the socket
Status =
Dispatch->WskSend(
Socket,
DataBuffer,
0, // No flags
Irp
);
// Return the status of the call to WskSend()
return Status;
}
// Send IoCompletion routine
NTSTATUS
SendComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
UNREFERENCED_PARAMETER(DeviceObject);
PWSK_BUF DataBuffer;
ULONG ByteCount;
// Check the result of the send operation
if (Irp->IoStatus.Status == STATUS_SUCCESS)
{
// Get the pointer to the data buffer
DataBuffer = (PWSK_BUF)Context;
// Get the number of bytes sent
ByteCount = (ULONG)(Irp->IoStatus.Information);
// Re-use or free the data buffer
...
}
// Error status
else
{
// Handle error
...
}
// Free the IRP
IoFreeIrp(Irp);
// Always return STATUS_MORE_PROCESSING_REQUIRED to
// terminate the completion processing of the IRP.
return STATUS_MORE_PROCESSING_REQUIRED;
}