{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。