Отправка данных через сокет датаграммы
После того как приложение Winsock Kernel (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 установило фиксированный адрес удаленного транспорта или адрес транспорта назначения для сокета датаграммы, параметр RemoteAddress , передаваемый в функцию WskSendTo , является необязательным и может иметь значение NULL. Если значение РАВНО NULL, датаграмма отправляется на фиксированный адрес удаленного транспорта или фиксированный адрес назначения. Если значение не равно NULL, датаграмма отправляется на указанный адрес удаленного транспорта.
Дополнительные сведения о настройке фиксированного удаленного транспортного адреса для сокета датаграммы см. в разделе SIO_WSK_SET_REMOTE_ADDRESS.
Дополнительные сведения о настройке фиксированного адреса транспорта назначения для сокета датаграммы см. в разделе SIO_WSK_SET_SENDTO_ADDRESS.