2010-09-20 64 views
1

此升壓udp服務器不能按預期運行。爲什麼不能提升asio代碼的正常工作?

它與封鎖的UDP迴應服務器EXCEPT相同,用於較小的更改。 我正在使用不同的套接字來返回響應,即sock2。 現在,如果客戶端與服務器位於同一臺計算機上,此代碼完美工作。 但是當我在不同的機器上運行這個時候,沒有收到響應。 但是,如果我將發送套接字更改爲sock而不是sock2,則它可以跨機器使用 。

任何想法爲什麼會這樣? wireshark根本沒有顯示任何錯誤。客戶端使用隨機源端口,但隨後在同一隨機端口上調用recv_from。服務器將響應發送回客戶端監聽的相同端口號。

#include <cstdlib> 
#include <iostream> 
#include <boost/asio.hpp> 

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

enum { max_length = 1024 }; 

void server(boost::asio::io_service& io_service, short port) 
{ 
    udp::socket sock(io_service, udp::endpoint(udp::v4(), port)); 
    udp::socket sock2(io_service, udp::endpoint(udp::v4(), 0)); 
    for (;;) 
    { 
    char data[max_length]; 
    udp::endpoint sender_endpoint; 
    size_t length = sock.receive_from(
     boost::asio::buffer(data, max_length), sender_endpoint); 
    printf("Got data, sending response to %s:%d\n", sender_endpoint.address().to_string().c_str(), sender_endpoint.port()); 
    sock2.send_to(boost::asio::buffer(data, length), sender_endpoint); 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 2) 
    { 
     std::cerr << "Usage: blocking_udp_echo_server <port>\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    using namespace std; // For atoi. 
    server(io_service, atoi(argv[1])); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 
+0

我在您發佈的代碼中看不到任何錯誤。與您的[上一個問題](http://stackoverflow.com/questions/3571156/why-doesnt-this-boost-asio-code-work-with-this-python-client)類似,請使用異步UDP服務器示例,請發佈您的客戶代碼。 – 2010-09-20 11:59:00

+0

它是相同的,除非它不能在整個網絡中工作!實際上從一臺Linux PC到同一臺PC上的一臺Windows虛擬機。但其他代碼的作品。 – Matt 2010-09-20 20:50:31

回答

0

回答我自己的問題!

檢查另一臺機器上沒有運行防火牆軟件!事實證明,VM中運行的Windows機器運行着Windows防火牆。

我沒有立即懷疑這是因爲當我使用傳入服務器的端口號在原始套接字上發送UDP響應時,它工作正常。

我猜Windows防火牆正在維護一些狀態。

相關問題