2010-08-02 90 views
1

我需要在使用boost ASIO編寫的UDP服務器中獲取數據報的源IP。 在示例udp數據報服務器行中:如何使用Boost ASIO在UDP服務器中傳遞源IP

注意:我當前的代碼與boost asio文檔中現有的udp async服務器示例相同。

socket_.async_receive_from(
     boost::asio::buffer(data_, max_length), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 

傳遞錯誤和bytes_transferred。我還需要郵件的地址。

現在我知道我可以直接使用sender_endpoint_.address()。to_string(),但我想通過它作爲參數。

所以我試着將sender_endpoint_.address()放入參數中。 即

socket_.async_receive_from(
     boost::asio::buffer(data_, MAX_LENGTH), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred, 
        sender_endpoint_.address())); 

但結果是從0.0.0.0讀handle_receive_from時。 但是,如果我只是訪問handle_receive_from 內的sender_endpoint_.address(),那麼我得到127.0.0.1,這是正確的。

如何正確傳遞?我需要這個,因爲會有多個線程調用io_service.run(),所以來自另一個源的數據包可能會覆蓋sender_endpoint,並且我需要能夠回覆該源數據包。

+0

你可以發佈你的'服務器'類的代碼嗎? – 2010-08-02 15:00:48

+0

目前它與async udp服務器示例相同。 – Matt 2010-08-02 22:01:17

回答

0

認爲如果您在您的處理程序中訪問sender_endpoint_.address(),然後再設置另一個異步處理程序,它會很好,並且不會被覆蓋。你在處理程序中再次調用async_receive_from,準備好接收另一個數據包?

在您嘗試sender_endpoint_.address()作爲參數的第二個代碼塊中,當設置處理程序時,sender_endpoint_.address()會被調用,而在接收到數據包時不會由處理程序執行。這就是爲什麼它總是0.0.0.0。

+0

謝謝,我確實想到了這一點,但沒有在這裏添加任何東西。 – Matt 2010-12-13 19:41:30

+0

UDP在這個封裝的IP地址中有一個僞頭。我不知道如何通過Boost.Asio訪問它。但是,*端口*是您需要知道發件人的信息。 – 2015-06-22 18:11:41

相關問題