2012-12-19 145 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套接字。

相關問題