2014-01-23 45 views
1

我正在將udp單播數據包從windows發送到linux。在Linux上升壓udp接收器失敗

我寫了簡單的應用udp客戶端和srever使用boost。

我在Linux上運行Windows和服務器(udp接收器)上的客戶端(udp發件人)。

我的客戶端發送udp數據包,但我的udp接收器在Linux上沒有收到數據包。但我可以看到wireshark上的udp數據包(正在我的linux pc上運行)。

我測試了端口和ipaddress,都是正確的。

下面是在linux上運行的代碼。

如果我運行在Windows上(客戶端和服務器),它工作正常

using boost::asio::ip::udp; 

class udp_server 
{ 
public: 
    udp_server(boost::asio::io_service& io_service) 
    : socket_(io_service, udp::endpoint(udp::v4(), 7799)) 
    { 
    start_receive(); 
    } 

private: 
    void start_receive() 
    { 
    socket_.async_receive_from(
     boost::asio::buffer(recv_buffer_), remote_endpoint_, 
     boost::bind(&udp_server::handle_receive, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 

    void handle_receive(const boost::system::error_code& error, 
     std::size_t /*bytes_transferred*/) 
    { 
    if (!error || error == boost::asio::error::message_size) 
    { 

     start_receive(); 
    } 
    } 

    udp::socket socket_; 
    udp::endpoint remote_endpoint_; 
    boost::array<char, 1> recv_buffer_; 
}; 

int main() 
{ 
    try 
    { 
    boost::asio::io_service io_service; 
    udp_server server(io_service); 
    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << e.what() << std::endl; 
    } 

return 0; 
} 
+0

我不能幫助您與您的代碼,但是你從boost.org複製代碼示例到底是什麼?如果不是從該開始 – NoSenseEtAl

回答

2

UDP是一種數據報協議。該協議是無狀態的,並且數據包需要作爲單個數據包被接收。

有關背景信息,請參閱Beej's Guide to Networking

但是,您的接收緩衝區是1個字節。你不能指望讀取比第一個字節更多的內容。

這看起來好像可以從例如tutorial 6 listing。不同的是,這是一個白天的服務,並不關心護理關於請求。它想知道的只是「收到一個數據包」,它只會無條件地發送白天的響應。

所以,一個解決方案似乎是增加緩衝區大小。如果軟件包的大小無法預測/不受限制,請考慮切換到流套接字(TCP/IP)。

這裏,作爲獎勵,使用C++ 11的風格:

#include <boost/asio.hpp> 

using boost::asio::ip::udp; 

class udp_server 
{ 
    public: 
     udp_server(boost::asio::io_service& io_service) 
      : socket_(io_service, udp::endpoint(udp::v4(), 7799)) 
     { 
      start_receive(); 
     } 

    private: 
     void start_receive() 
     { 
      socket_.async_receive_from(
       boost::asio::buffer(recv_buffer_), remote_endpoint_, 
       [this](boost::system::error_code ec, std::size_t bytes_transferred) 
       { 
        if (!ec && (bytes_transferred > 0)) 
        { 
         std::cout << "PACKET[" << std::string(&recv_buffer_[0], &recv_buffer_[0]+bytes_transferred) << "]\n"; 
        } else 
         throw ec; // TODO 
        start_receive(); 
       }); 
     } 

     udp::socket socket_; 
     char recv_buffer_[1024]; 
     udp::endpoint remote_endpoint_; 
}; 

int main() 
{ 
    std::cout << std::unitbuf; 
    try 
    { 
     boost::asio::io_service io_service; 
     udp_server server(io_service); 
     io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 
} 
+0

嗨,感謝這工作正常..現在我面臨的其他問題,我正在接入一些多播IP和發送一些數據包。現在我需要得到發送端口,我從192.168.1.111:P1發送到239.255.255.250:1900 ..這裏P1是隨機選擇提升,我需要得到該端口並傳遞給這個接收器開始聽在 – indra

+0

沒有讀你的代碼:你嘗試過'socket.bind()'http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_stream_socket/bind/overload1.html – DeVadder