为什么关闭udp socket块?

时间:2014-07-15 08:03:27

标签: c++ windows sockets networking udp

我正在为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
  }
}

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

为此,我调用shutdown(_socket, SD_BOTH)方法。不幸的是,关闭自己的呼叫 BLOCKS

在阅读MSDN中的每个可能的页面后,我没有找到任何关于为什么会发生这种情况的提法,以及其他攻击问题的方法或任何出路。

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

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

1 个答案:

答案 0 :(得分:0)

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