UDP绑定失败

时间:2014-01-13 10:21:24

标签: c++ boost mingw

{Windows 7,MinGW 4.8,boost 1.55}

我遇到UDP绑定问题。我有一个客户端,它为监听特定端口的监听器广播数据报,如果监听器想要回复某些东西,则绑定到端口本身。 客户端需要绑定的端口是X,服务器正在侦听Y.

问题: 如果我在将UDP套接字绑定到端口后模拟客户端崩溃(例如,通过解除引用nullptr导致分段错误),那么一旦客户端应用程序不再运行(不再列在Windows任务管理器中)netstat -ano |发现“X”仍然显示有人被绑定到 X 并且IP地址为0.0.0.0(客户端已将IP地址指定为任何地址)。在Windows任务管理器中找不到PID。但是,当我下载应用程序TCPView时,我可以看到<non-existent>进程仍然绑定到50000.在启动客户端时(此时不会使其崩溃)。

我有两种行为:

&LT 1为卤素;在某些计算机上,客户端无法再次绑定到套接字(尽管reuse_address选项设置为true),并且错误消息为:尝试以其访问权限禁止的方式访问套接字。

&LT 2 - ;在其他机器上,客户端成功绑定但未调用读取处理程序,并且客户端在端口X上不接收任何数据报,尽管服务器单播到客户端端口X.实际上&lt; 2&gt;即使在同一台机器上启动多个客户端实例也是如此,即使没有故意使客户端崩溃并作为僵尸进程存在。只有第一个获得数据报。

以下是客户端套接字的设置方式:

if(!m_udpSocket.is_open()) 
   { 
      m_udpSocket.open(m_localEndpoint.protocol(), errorCode); //m_localEndpoint is address 0.0.0.0 and port X 
      if(errorCode) 
      { 
         std::cerr << "Unable to open socket: " << errorCode.message() << std::endl; 
      } 
      else 
      { 
         m_udpSocket.set_option(boost::asio::socket_base::reuse_address(true), errorCode); 
         if(errorCode) 
         { 
            std::cerr << "Reuse address option set failure. " << errorCode.message() << std::endl; 
         } 

         m_udpSocket.set_option(boost::asio::socket_base::broadcast(true), errorCode); 
         if(errorCode) 
         { 
            std::cerr << "Socket cannot send broadcast. " << errorCode.message() << std::endl; 
         } 
         else 
         { 
            m_udpSocket.bind(m_localEndpoint, errorCode); 
            if(errorCode) 
            { 
               std::cerr << "Socket cannot bind...!! " << errorCode.message() << std::endl; 
            } 
         } 
      } 
   } 

你能解释我为什么得到&lt; 1&gt;和&lt; 2&gt;如果有一些其他进程绑定到该套接字,我该怎么做才能避免它们并使socket绑定?我需要支持Windows,Linux和MAC。

0 个答案:

没有答案