阅读量:11
本文内容
当 Winsock 内核 (WSK) 应用程序通过已建立的套接字连接完成发送和接收数据时,它可以断开面向连接的套接字与其连接到的远程传输地址的连接。 WSK 应用程序通过调用 WskDisconnect 函数断开套接字与远程传输地址的连接。 WSK 应用程序可以执行 中止断开连接 或套接字的 正常断开连接 。 有关中止断开连接与正常断开连接之间的差异的详细信息,请参阅 WskDisconnect。
下面的代码示例演示 WSK 应用程序如何正常断开面向连接的套接字与远程传输地址的连接。
// Prototype for the disconnect IoCompletion routine
NTSTATUS
DisconnectComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
);
// Function to disconnect a socket from a remote transport address
NTSTATUS
DisconnectSocket(
PWSK_SOCKET Socket
)
{
PWSK_PROVIDER_CONNECTION_DISPATCH Dispatch;
PIRP Irp;
NTSTATUS Status;
// Get pointer to the socket's 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,
DisconnectComplete,
Socket, // Use the socket object for the context
TRUE,
TRUE,
TRUE
);
// Initiate the disconnect operation on the socket
Status =
Dispatch->WskDisconnect(
Socket,
NULL, // No final data to be transmitted
0, // No flags (graceful disconnect)
Irp
);
// Return the status of the call to WskDisconnect()
return Status;
}
// Disconnect IoCompletion routine
NTSTATUS
DisconnectComplete(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
UNREFERENCED_PARAMETER(DeviceObject);
PWSK_SOCKET Socket;
// Check the result of the disconnect operation
if (Irp->IoStatus.Status == STATUS_SUCCESS)
{
// Get the socket object from the context
Socket = (PWSK_SOCKET)Context;
// Perform the next operation on the socket
...
}
// 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 应用程序正常断开套接字,则应用程序可以通过将指向 WSK_BUF 结构的指针传递给 WskDisconnect 函数,在断开套接字连接之前,向远程传输地址发送最终的数据缓冲区。
如果 WSK 应用程序关闭了面向连接的套接字,但没有先断开套接字与其所连接到的远程传输地址的连接,则 WSK 子系统会在关闭套接字之前自动执行套接字的中止断开连接。 有关关闭套接字的详细信息,请参阅 关闭套接字。