データグラム ソケット経由でのデータの送信
Winsock カーネル (WSK) アプリケーションは、データグラム ソケットをローカル トランスポート アドレスにバインドした後、ソケット経由でデータグラムを送信できます。 WSK アプリケーションは、WskSendTo 関数を呼び出して、データグラム ソケット経由でデータグラムを送信します。
次のコード例は、WSK アプリケーションがデータグラム ソケット経由でデータグラムを送信する方法を示しています。
// Prototype for the send datagram IoCompletion routine
NTSTATUS
SendDatagramComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
);
// Function to send a datagram
NTSTATUS
SendDatagram(
PWSK_SOCKET Socket,
PWSK_BUF DatagramBuffer,
PSOCKADDR RemoteAddress
)
{
PWSK_PROVIDER_DATAGRAM_DISPATCH Dispatch;
PIRP Irp;
NTSTATUS Status;
// Get pointer to the provider dispatch structure
Dispatch =
(PWSK_PROVIDER_DATAGRAM_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,
SendDatagramComplete,
DatagramBuffer, // Use the datagram buffer for the context
TRUE,
TRUE,
TRUE
);
// Initiate the send operation on the socket
Status =
Dispatch->WskSendTo(
Socket,
DatagramBuffer,
0, // No flags
RemoteAddress,
0,
NULL, // No associated control info
Irp
);
// Return the status of the call to WskSendTo()
return Status;
}
// Send datagram IoCompletion routine
NTSTATUS
SendDatagramComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
UNREFERENCED_PARAMETER(DeviceObject);
PWSK_BUF DatagramBuffer;
ULONG ByteCount;
// Check the result of the send operation
if (Irp->IoStatus.Status == STATUS_SUCCESS)
{
// Get the pointer to the datagram buffer
DatagramBuffer = (PWSK_BUF)Context;
// Get the number of bytes sent
ByteCount = (ULONG)(Irp->IoStatus.Information);
// Re-use or free the datagram 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;
}
WSK アプリケーションが、データグラム ソケットの固定リモート トランスポート アドレスまたは固定宛先トランスポート アドレスを設定している場合、WskSendTo 関数に渡される RemoteAddress パラメーターは省略可能であり、NULL にすることができます。 NULL の場合、データグラムは固定リモート トランスポート アドレスまたは固定宛先トランスポート アドレスに送信されます。 NULL 以外の場合、データグラムは指定されたリモート トランスポート アドレスに送信されます。
データグラム・ソケットの固定リモート・トランスポート・アドレスの設定の詳細については、「SIO_WSK_SET_REMOTE_ADDRESS」を参照してください。
データグラム・ソケットの固定宛先トランスポート・アドレスの設定の詳細については、「SIO_WSK_SET_SENDTO_ADDRESS」を参照してください。