2016-09-23 155 views
3

當我在UDP服務器上工作時,我通常將套接字設置爲偵聽指定的端口並接受任何IP。請記住,同步接收在這裏正常工作。Boost Asio 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通

+0

做你現在的工作?我使用Boost 1.66的UDP組播樣本,它工作。 – CaTx

回答

1

的問題是,您socketUDP的沒有配置:

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

然而,簡單地調用上面你的插座線將無法正常工作,因爲你必須套接字綁定到端點之前調用reuse_address......但你正在構建udp::socketendpoint打開它將其綁定到端點,請參閱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)); 
... 
+0

我認爲這真的很棒,但它解決了之後會發生的問題。現在即使1臺服務器也不能使用指定的IP。 – Arrr

+0

我很抱歉聽到@ Arrr ..有一些代碼爲'UDP'接收器工作(據我所知)[這裏](https://github.com/kenba/via-httplib/tree/master /包含/經由/通訊)。它僅爲'TCP'套接字記錄,但只需用'udp_adaptor'替換'tcp_adaptor'並調用'receive_multicast'函數。順便說一下,你聽的是哪個端口:'9999'或'4747'? – kenba