结合来自boost 文档和连接函数手册的信息,我认为asio::udp::socket::connect函数用于设置默认发送数据报的地址,以及接收数据报的唯一地址。
这很好用,但手册还指出我应该能够解除关联(断开连接),这就是我遇到的问题。即我希望套接字再次开始从任何地址接收数据包。
手册中进一步写道:
Connectionless sockets may dissolve the association by connecting to an
address with the sa_family member of sockaddr set to AF_UNSPEC.
我试过这段代码:
asio::udp::endpoint unspecified_endpoint;
assert(unspecified_endpoint.address().is_unspecified()); // OK
socket.connect(unspecified_endpoint);
但这并没有帮助。
编辑:通过从 boost::asio 页面获取客户端和服务器示例来创建一个测试用例。在客户端代码中,我将传出端口号从随机更改为 5192:
udp::socket s(io_service, udp::endpoint(udp::v4(), 5192));
我更改了服务器代码中的功能服务器:
void server(boost::asio::io_service& io_service, short port)
{
udp::socket sock(io_service, udp::endpoint(udp::v4(), port));
#define CASE 3
#if CASE == 1
sock.connect(udp::endpoint());
#elif CASE == 2
sock.connect(udp::endpoint(ip::address::from_string("127.0.0.1"), 5193));
sock.connect(udp::endpoint());
#elif CASE == 3
sock.connect(udp::endpoint(ip::address::from_string("192.168.1.3"), 5192));
sock.connect(udp::endpoint());
#endif
for (;;)
{
char data[max_length];
udp::endpoint sender_endpoint;
size_t length = sock.receive_from(
boost::asio::buffer(data, max_length), sender_endpoint);
sock.send_to(boost::asio::buffer(data, length), sender_endpoint);
}
}
案例 1 和 2 似乎有效,但在案例 3 中,客户不会收到回复。完整的源代码可以在这里找到。