8

boost::asioプロトコルごとに個別のエンドポイント クラスを定義しているようです。これは、特定のエンドポイントで UDP と TCP の両方の操作を実行する場合 (一方から他方に変換する必要がある場合) にイライラします。TCP や UDP に関係なく、私は常にエンドポイントを IP アドレス (v4 または v6) とポート番号と考えていました。

別のクラスを正当化する重要な違いはありますか? (つまり、両方tcp::socketとのudp::socketようなものを受け入れることはできませんでしたip::endpointか?)

4

2 に答える 2

4

ソケットの作成方法が異なります

socket(PF_INET, SOCK_STREAM)

TCP の場合、および

socket(PF_INET, SOCK_DGRAM)

UDP用。

Boost.Asio で型が異なるのはそのためだと思います。man 7 udpまたは詳細についてman 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
于 2010-07-23T17:55:16.243 に答える
3

TCP ポートと UDP ポートは異なります。たとえば、一方が TCP を使用し、もう一方が UDP を使用している限り、2 つの別個のプログラムはどちらも 1 つのポートでリッスンできます。これが、エンドポイント クラスが異なる理由です。

于 2011-11-17T06:00:15.940 に答える