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 绑定文档中,这似乎是可能的。

4

2 回答 2

0

链接到参考显示了两个重载。编译器选择第一个(树参数重载),因为您将 anUDTSOCKET作为第一个参数传递有第二个参数。

由于三参数重载中的第二个参数不是 aSOCKET你会得到第一个错误。而且由于您只将两个参数传递给期望三个参数的函数,因此您会得到第二个错误。

如果要绑定到特定地址(例如sin传递给函数的参数),则需要将指向该地址结构的指针作为第二个参数传递,并将该结构的大小作为第三个参数传递:

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

如果要使用第二个重载,请使用它:

UDT::bind(sock);

你不能随心所欲地混搭,你必须选择一个或另一个。

于 2014-11-06T11:12:04.777 回答
0

技术答案隐藏在上面的评论中:使用

bind2(udtsocket, udpsocket)

在创建的 UDT/UDP 套接字上。

关于打孔,这可以在不考虑 UDP 的情况下完成,请参阅 UDT Hole Punching Pattern。这也显示了 RENDEVOUS 选项的有效使用。

在这种情况下,UDT 需要唯一的连接,即一次您要么连接到集合服务器,要么与另一个节点处于 P2P 模式;这是建立一系列独立 P2P 连接的唯一正确方法。

引用的“UDT 打孔模式”中的不完美之处在于,UDT 套接字绑定到一个固定参数地址;更好的办法是把socket绑定到端口0,系统会分配一个合适的动态端口,getsockname()在P2P模式下可以取回再使用。

于 2021-05-17T06:20:43.187 回答