断开套接字与目标的连接

avatar
作者
筋斗云
阅读量: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 子系统会在关闭套接字之前自动执行套接字的中止断开连接。 有关关闭套接字的详细信息,请参阅 关闭套接字。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!