为什么关闭udp套接字块

why shutdown on udp socket blocks?

本文关键字:套接字 udp 为什么      更新时间:2023-10-16

我正在为windows桌面/服务器编写UDP服务器应用程序。

我的代码使用windows建议的WSA API如下方式(这是我简化的receivePacket方法):

struct Packet
{
  unsigned int size;
  char buffer[MAX_SIZE(1024)];
}
bool receivePacket(Packet packet)
{
  WSABUFFER wsa_buffer[2];
  wsa_buffer[0].buf = &packet.size;
  wsa_buffer[0].len = sizeof(packet.size);
  wsa_buffer[1].buf = packet.buffer;
  wsa_buffer[1].len = MAX_SIZE;
  bool retval = false;
  int flags = 0;
  int recv_bytes = 0;
  inet_addr client_addr;
  int client_addr_len = sizeof(client_addr);
  if(WSARecvFrom(_socket, wsa_buffer, sizeof(wsa_buffer)/sizeof(wsa_buffer[0]), &bytes_recv, &flags, (sockaddr *)&client_addr, &client_addr_len, NULL, NULL) == 0)
  {
    //Packet received successfully
  }
  else
  {
    //Report
  }
}

现在,当我试图优雅地关闭我的应用程序时,不是网络明智的,而是应用程序明智的(通过所有的d'tor和东西),我试图解锁这个调用。

为此,我调用shutdown(_socket, SD_BOTH)方法。不幸的是,对shutdown本身的调用会阻塞!

在阅读了MSDN中可能的每一页后,我没有找到任何关于为什么会发生这种情况的参考,其他解决问题的方法或任何出路。

我检查的另一件事是使用SO_RCVTIMEO。令人惊讶的是,这个sockopt并没有像预期的那样工作。

我的代码/方法有什么问题吗?

是否对重复句柄运行了shutdown ?在同一句柄上的关闭将等待该句柄上的任何活动操作完成。