Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Windows Boost::带有临时端口的asio UDP广播_Windows_Sockets_Udp_Boost Asio - Fatal编程技术网

Windows Boost::带有临时端口的asio UDP广播

Windows Boost::带有临时端口的asio UDP广播,windows,sockets,udp,boost-asio,Windows,Sockets,Udp,Boost Asio,我在boost::asio下的udp广播事务中遇到问题,与以下代码片段有关。因为我试图在这个实例中广播,所以deviceIP=“255.255.255.255”。devicePort是为我的设备指定的管理端口。我想使用临时本地端口,因此如果可能的话,我更希望连接后不必使用socket.bind(),代码通过设置localPort=0来支持单播 boost::asio::ip::address_v4 targetIP = boost::asio::ip::address_v4::from_stri

我在boost::asio下的udp广播事务中遇到问题,与以下代码片段有关。因为我试图在这个实例中广播,所以deviceIP=“255.255.255.255”。devicePort是为我的设备指定的管理端口。我想使用临时本地端口,因此如果可能的话,我更希望连接后不必使用socket.bind(),代码通过设置localPort=0来支持单播

boost::asio::ip::address_v4 targetIP = boost::asio::ip::address_v4::from_string(deviceIP);
m_targetEndPoint = boost::asio::ip::udp::endpoint(targetIP, devicePort);

m_ioServicePtr = boost::shared_ptr<boost::asio::io_service>(new boost::asio::io_service);
m_socketPtr = boost::shared_ptr<boost::asio::ip::udp::socket>(new boost::asio::ip::udp::socket(*m_ioServicePtr));
m_socketPtr->open(m_targetEndPoint.protocol());

m_socketPtr->set_option(boost::asio::socket_base::broadcast(true));

// If no local port is specified, default parameter is 0
// If local port is specified, bind to that port.
if(localPort != 0)
{
  boost::asio::ip::udp::endpoint localEndpoint(boost::asio::ip::address_v4::any(), localPort);
  m_socketPtr->bind(localEndpoint);
}

if(m_forceConnect)
  m_socketPtr->connect(m_targetEndPoint);

this->AsyncReceive(); // Register Asynch Recieve callback and buffer
m_socketThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&MyNetworkBase::RunSocketThread, this))); // Start thread running io_service process

在这里,我提取初始临时端口号并尝试绑定到它,但有趣的是,当我尝试绑定时会引发无效参数异常。

好的,我找到了解决此问题的方法。在linux下这是不必要的,但在windows下,我发现如果您既不绑定也不连接,那么在调用asynch_receive_from()之前,您必须先传输一些内容,该调用包含在我的this->asynch_receive()方法中

我的解决方案是,在windows下进行asynch_receive调用之前,立即进行空字符串的虚拟传输,因此修改后的代码变成:

m_socketPtr->set_option(boost::asio::socket_base::broadcast(true));

// If no local port is specified, default parameter is 0
// If local port is specified, bind to that port.
if(localPort != 0)
{
  boost::asio::ip::udp::endpoint localEndpoint(boost::asio::ip::address_v4::any(), localPort);
  m_socketPtr->bind(localEndpoint);
}

if(m_forceConnect)
  m_socketPtr->connect(m_targetEndPoint);

// A dummy TX is required for the socket to acquire the local port properly under windoze
// Transmitting an empty string works fine for this, but the TX must take place BEFORE the first call to Asynch_receive_from(...)
#ifdef WIN32
m_socketPtr->send_to(boost::asio::buffer("", 0), m_targetEndPoint);
#endif

this->AsyncReceive(); // Register Asynch Recieve callback and buffer
m_socketThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&MyNetworkBase::RunSocketThread, this)));
m_socketPtr->set_选项(boost::asio::socket_base::broadcast(true));
//如果未指定本地端口,则默认参数为0
//如果指定了本地端口,则绑定到该端口。
如果(localPort!=0)
{
boost::asio::ip::udp::endpoint localEndpoint(boost::asio::ip::address\u v4::any(),localPort);
m_socketPtr->bind(localEndpoint);
}
如果(m_forceConnect)
m_socketPtr->connect(m_targetEndPoint);
//插座需要一个虚拟TX,以便在windoze下正确获取本地端口
//传输空字符串可以很好地实现这一点,但发送必须在从(…)首次调用Asynch_receive_之前进行
#ifdef WIN32
m_socketPtr->send_to(boost::asio::buffer(“,0”),m_targetEndPoint);
#恩迪夫
此->AsyncReceive();//注册异步接收回调和缓冲区
m_socketThread=boost::shared_ptr(新的boost::thread(boost::bind(&MyNetworkBase::RunSocketThread,this));

在我的书中,这有点像黑客,但它比实现所有的需求要好得多,将对异步接收方的调用推迟到第一次传输之后

当我在Linux中使用m_forceConnect=false和localPort=0运行代码时,一切运行正常。数据包从临时端口广播,并且在节目中正确接收对该数据包的回复。您收到的10022错误代码表明您正在使用Windows。也许这是Windows特有的问题?
m_socketPtr->set_option(boost::asio::socket_base::broadcast(true));

// If no local port is specified, default parameter is 0
// If local port is specified, bind to that port.
if(localPort != 0)
{
  boost::asio::ip::udp::endpoint localEndpoint(boost::asio::ip::address_v4::any(), localPort);
  m_socketPtr->bind(localEndpoint);
}

if(m_forceConnect)
  m_socketPtr->connect(m_targetEndPoint);

// A dummy TX is required for the socket to acquire the local port properly under windoze
// Transmitting an empty string works fine for this, but the TX must take place BEFORE the first call to Asynch_receive_from(...)
#ifdef WIN32
m_socketPtr->send_to(boost::asio::buffer("", 0), m_targetEndPoint);
#endif

this->AsyncReceive(); // Register Asynch Recieve callback and buffer
m_socketThread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&MyNetworkBase::RunSocketThread, this)));