Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要关闭udp套接字块?_C++_Windows_Sockets_Networking_Udp - Fatal编程技术网

C++ 为什么要关闭udp套接字块?

C++ 为什么要关闭udp套接字块?,c++,windows,sockets,networking,udp,C++,Windows,Sockets,Networking,Udp,我正在为windows桌面/服务器编写UDP服务器应用程序 我的代码以以下方式使用windows建议的WSA API(这是我简化的receivePacket方法): 现在,当我试图优雅地关闭我的应用程序时,不是在网络方面,而是在应用程序方面(查看所有的任务和内容),我试图取消阻止这个调用 为此,我调用shutdown(\u socket,SD\u BOTH)方法。不幸的是,对关机本身的调用会阻塞 在阅读了MSDN中所有可能的页面后,我没有找到任何关于为什么会发生这种情况的参考资料,也没有找到其他

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

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

现在,当我试图优雅地关闭我的应用程序时,不是在网络方面,而是在应用程序方面(查看所有的任务和内容),我试图取消阻止这个调用

为此,我调用
shutdown(\u socket,SD\u BOTH)
方法。不幸的是,对关机本身的调用会阻塞

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

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


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

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

您是否在程序开始时初始化了WSA?你的行为如何?你能添加套接字创建和选项设置代码吗?这是不可能的。代码写在未连接到网络的另一台计算机上。我确实初始化了WSA,初始化成功。这是我的程序创建的唯一套接字。调用bind后,我使用setsockopt(_socket,SOL_socket,SO_RCVTIMEO,&timeout,sizeof(timeout)),它返回零(成功)。我在MSDN中找到了关于SO_RCVTIMEO选项的信息,这可能解释了为什么它没有按照您的预期运行:“阻止接收呼叫的超时(以毫秒为单位)。此选项的默认值为零,表示接收操作不会超时。如果阻塞接收调用超时,则连接处于不确定状态,应关闭。如果套接字是使用WSASocket函数创建的,那么dwFlags参数必须设置WSA_FLAG_OVERLAPPED属性,超时才能正常工作。否则超时将永远不会生效。“顺便问一下,你读过这篇文章吗?这些评论也有点令人担忧。你是否尝试过只使用
SD\u RECEIVE
而不是
SD\u BOTH
?为什么要
关闭一个UDP套接字?
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
  }
}