2010-07-23 3 views
6

Кажется, boost: asio определяет отдельный класс конечных точек для каждого протокола, что вызывает раздражение, если вы хотите выполнять как UDP, так и TCP-операции на конкретной конечной точке (приходится конвертировать из одного в другой). Я всегда думал о конечной точке как о IP-адресе (v4 или v6) и номере порта, независимо от TCP или UDP. Существуют ли существенные различия, которые оправдывают отдельные классы? (Т.е. не может и ТСР :: гнездо и УДП :: сокет принимает что-то вроде IP :: конечной точки?)В чем разница между tcp :: endpoint и udp :: endpoint в Boost :: Asio?

ответ

4

Гнезда создаются по-разному

socket(PF_INET, SOCK_STREAM) 

для TCP и

socket(PF_INET, SOCK_DGRAM) 

для UDP.

Я подозреваю, что это причина для разных типов в Boost.Asio. См. man 7 udp или man 7 tcp для получения дополнительной информации. Я предполагаю, что Linux, поскольку вы не отметили свой вопрос.

Чтобы решить вашу проблему, извлеките IP-адрес и порт из конечной точки TCP и создайте экземпляр конечной точки 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. Вот почему классы конечных точек различны.

 Смежные вопросы

  • Нет связанных вопросов^_^