0

UDT ライブラリを使用して、NAT の背後にあるコンピューターとの間でファイルを転送しています。私はすでにPythonで穴あけプロトコルを行っており、それがどのように機能するかを知っています。ここでは、UDT ソケットを既存の UDP ソケットにバインドしようとしています。

int udt_holepunching(SOCKET sock, SOCKADDR_IN sin, int size, SOCKADDR_IN peeraddr)
    {
      UDTSOCKET u;
      bool rdv = true;



      UDT::setsockopt(u, 0, UDT_RENDEZVOUS, &rdv, sizeof(bool));
      UDT::bind(u, sock);
      UDT::connect(u, &peeraddr, sizeof(peeraddr));
    }

sock既存のUDPソケットと話しpeeraddrたいコンピューターのアドレスで

私はこのエラーがあります:

client.cpp: In function ‘int udt_holepunching(SOCKET, SOCKADDR_IN, int, SOCKADDR_IN)’:
client.cpp:29:20: error: invalid conversion from ‘SOCKET {aka int}’ to ‘const sockaddr*’ [-fpermissive]
   UDT::bind(u, sock);
                    ^
client.cpp:29:20: error: too few arguments to function ‘int UDT::bind(UDTSOCKET, const sockaddr*, int)’
In file included from client.cpp:13:0:
../src/udt.h:315:13: note: declared here
 UDT_API int bind(UDTSOCKET u, const struct sockaddr* name, int namelen);

UDT bind documentationでは可能であるように見えるので、それはちょっと奇妙です。

4

2 に答える 2

0

リンク先の参照は、2 つのオーバーロードを示しています。UDTSOCKET最初の引数として渡し、2 番目の引数があるため、コンパイラは最初のもの (ツリー引数のオーバーロード) を選択します。

3 引数オーバーロードの 2 番目の引数は ではないSOCKETため、最初のエラーが発生します。また、3 つを期待する関数に 2 つの引数しか渡さないため、2 番目のエラーが発生します。

sin特定のアドレス (関数に渡す引数など)にバインドする場合は、そのアドレス構造体へのポインターを 2 番目の引数として渡し、その構造体のサイズを 3 番目の引数として渡す必要があります。

UDT::bind(u, (const SOCKADDR*) &sin, sizeof(sin));

2 番目のオーバーロードを使用する場合は、次のように使用します。

UDT::bind(sock);

好きなように組み合わせることはできません。どちらかを選択する必要があります。

于 2014-11-06T11:12:04.777 に答える
0

技術的な答えは上記のコメントに隠されています:

bind2(udtsocket, udpsocket)

作成された UDT/UDP ソケットで。

ホール パンチングに関しては、これは UDP をまったく考慮せずに行うことができます 。UDT ホール パンチング パターンを参照してください。これは、RENDEVOUS オプションの有効な使用法も示しています。

このシナリオの UDT には、一意の接続が必要です。つまり、ある時点で、ランデヴァス サーバーに接続するか、別のノードと P2P モードになります。これは、いくつかの独立した P2P 接続のシーケンスを確立する唯一の適切な方法です。

参照されている「UDT ホール パンチング パターン」で完全ではないのは、UDT ソケットが固定パラメーター アドレスにバインドされていることです。getsockname()ソケットをポート 0 にバインドすることをお勧めします。システムは、P2P モードで取得して再利用できる適切な動的ポートを割り当てます。

于 2021-05-17T06:20:43.187 に答える