gpt4 book ai didi

c++ - Boost Asio UDP 服务器设置套接字以监听指定 IP

转载 作者:太空狗 更新时间:2023-10-29 21:36:39 25 4
gpt4 key购买 nike

当我在 UDP 服务器上工作时,我通常将套接字设置为监听指定端口并接受任何 IP。请记住,同步接收在这里可以正常工作。

std::unique_ptr<boost::asio::ip::udp::socket> socketUDP;    
socketUDP.reset(new udp::socket(io_serviceUDP, udp::endpoint(udp::v4(), 9999)));

但是,我真的很想让 2 个不同的服务器应用程序在同一个端口 (9999) 上监听,但只接受一个 IP(我已经知道那个 IP)。每个应用程序都有自己的客户端和自己的 IP。但出于某种原因,以下内容不起作用(在应用程序中未收到任何数据包,而 Wireshark 可以看到它)

socketUDP.reset(new udp::socket(m_io_serviceUDP, udp::endpoint(asio::ip::address::from_string("169.254.1.2"), 9999)));

请注意:1) 根据答案:Issue with broadcast using Boost.Asio这实际上应该有效。当然我的理解不太正确,因为我遗漏了一些东西

2)提供的IP有效,有效,发送数据(wireshark确认),可以ping通

最佳答案

问题是您的 socketUDP 没有配置:

set_option(boost::asio::ip::udp::socket::reuse_address(true));

但是,简单地在您的套接字上调用上面的行是行不通的,因为您必须调用 reuse_address 套接字绑定(bind)到端点之前...但是您正在构造 udp::socket 和一个 endpoint 打开它将它绑定(bind)到端点,参见basic_datagram_socket .

解决方案是调用只接受io_service 的构造函数;打开它,设置 reuse_address 选项并然后 bind 它,例如:

// construct the socket
boost::asio::ip::udp::socket socket_(io_service_);

// open it
boost::asio::ip::udp::endpoint rx_endpoint_(udp::v4(), 9999);
socket_.open(rx_endpoint_.protocol(), error);
if (error)
return false;

// then set it for reuse and bind it
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_.bind(rx_endpoint_, error);
if (error)
return false;

// set multicast group, etc.
socket_.set_option(boost::asio::ip::multicast::join_group(ip_address));
...

关于c++ - Boost Asio UDP 服务器设置套接字以监听指定 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com