2010-07-23 162 views
6

似乎boost :: asio爲每個協議定義了一個單獨的端點類,如果您想要在特定端點上執行UDP和TCP操作(不得不從一個端口轉換到另一個端口),這是令人煩惱的。我總是將端點視爲IP地址(v4或v6)和端口號,而不考慮TCP或UDP。是否有顯着的差異來證明單獨的課程是合理的(即不能在TCP ::插座和udp ::插座接受類似IP端點::?)Boost :: Asio中tcp :: endpoint和udp :: endpoint有什麼區別?

回答

4

插槽分別創建不同

socket(PF_INET, SOCK_STREAM) 

的TCP和

socket(PF_INET, SOCK_DGRAM) 
用於UDP的

我懷疑這是Boost.Asio中不同類型的原因。有關更多信息,請參見man 7 udpman 7 tcp,因爲您沒有標記您的問題,所以我假設Linux。

要解決您的問題,請從TCP端點提取IP和端口並實例化UDP端點。

#include <boost/asio.hpp> 

#include <iostream> 

int 
main() 
{ 
    using namespace boost::asio; 
    ip::tcp::endpoint tcp( 
      ip::address::from_string("127.0.0.1"), 
      123 
      ); 

    ip::udp::endpoint udp(
      tcp.address(), 
      tcp.port() 
      ); 

    std::cout << "tcp: " << tcp << std::endl; 
    std::cout << "udp: " << udp << std::endl; 

    return 0; 
} 

樣品調用:

./a.out 
tcp: 127.0.0.1:123 
udp: 127.0.0.1:123 
2

TCP和UDP端口是不同的。例如,只要一個使用TCP而另一個使用UDP,兩個獨立的程序都可以在單個端口上偵聽。這就是端點類不同的原因。