2012-12-19 103 views
0

boost docsmanual for connect function结合的信息,我认为ASIO :: UDP ::插座::连接功能用于设置地址,以便数据包被发送到做断开的UDP套接字默认情况下,以及接收数据报的唯一地址。如何使用boost :: ASIO

这很好地工作,但手册还指出,我应该能够解散关联(断开),这是我有问题做。即我希望socket再次开始接收来自任何地址的数据包。

手册中进一步写到:

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页面服用clientserver实例创建一个测试用例。在客户端代码,我已经改变了输出端口数量从随机到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客户不会收到答复。完整的来源可以找到here

+0

udp不是面向连接的。 – bbg

+1

@bbg,确实,但连接不是我想要完成的。这个函数被称为* connect *有点让人误解,但它所做的只是为输入和输出数据包的地址设置一个过滤器。我遇到麻烦的是删除此过滤器。 –

+0

boost asio代码实际上传递了带有未指定IP地址的AF_INET来连接(而不是AF_UNSPEC),但这仍然可以在我的Linux系统上运行。您使用的操作系统是什么,您可以将代码发布到完整(最小)的示例中吗? – cmeerw

回答

2

作为评价所提到的,在调用sock.connect(udp::endpoint());转化为connect(6, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0这是不一样的,与一个AF_UNSPECconnect不完全断开UDP套接字(它似乎仅重置对等端口号)。

我不认为有一种方式来实现你升压想要什么纯粹的ASIO,但你可以只使用一个本地POSIX调用断开插座,就像

struct sockaddr unspec_addr = { AF_UNSPEC }; 
::connect(sock.native_handle(), &unspec_addr, sizeof(unspec_addr)); 

调试笔记的内容:运行该程序与strace然后使用netstat -nu列出UDP套接字。

相关问题