從boost docs和manual 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頁面服用client和server實例創建一個測試用例。在客戶端代碼,我已經改變了輸出端口數量從隨機到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。
udp不是面向連接的。 – bbg
@bbg,確實,但連接不是我想要完成的。這個函數被稱爲* connect *有點讓人誤解,但它所做的只是爲輸入和輸出數據包的地址設置一個過濾器。我遇到麻煩的是刪除此過濾器。 –
boost asio代碼實際上傳遞了帶有未指定IP地址的AF_INET來連接(而不是AF_UNSPEC),但這仍然可以在我的Linux系統上運行。您使用的操作系統是什麼,您可以將代碼發佈到完整(最小)的示例中嗎? – cmeerw