【问题标题】:bind existing socket with UDT将现有套接字与 UDT 绑定
【发布时间】:2014-11-06 10:31:36
【问题描述】:

我正在使用 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,这似乎是可能的。

【问题讨论】:

  • 首先,您显示的代码与错误不匹配。其次,再次阅读错误,它告诉您bind 所需的参数,而不是您传递给它的参数。
  • 我的错,我编辑了它。我明白你的意思,但在文档中写到 bind 只能接受一个参数:现有的 UDP 套接字。这就是我正在尝试做的,但它不起作用
  • 我认为这可能是文档错误,您可以尝试改用bind2(UDTSOCKET, UDPSOCKET) 吗?
  • 其实是bind2(udtsocket, udpsocket) 谢谢提示!

标签: c++ sockets udp udp-data-transfer


【解决方案1】:

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

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

如果你想绑定到一个特定的地址(比如你传递给你的函数的sin 参数),那么你需要传递一个指向该地址结构的指针作为第二个参数,并将该结构的大小作为第三个参数论据:

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

如果你想使用第二个重载,那就使用它:

UDT::bind(sock);

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

【讨论】:

  • 我明白你的意思。实际上,我想绑定到现有的 UDP 套接字。所以我想像文档中描述的那样使用第二个重载。所以我尝试这样的事情:UDT::bind(sock) 但我有同样的错误
  • 有效!实际上这是文档中的错误。我应该使用UDT::bind2(UDPSOCKET, UDTSOCKET)
【解决方案2】:

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

bind2(udtsocket, udpsocket)

关于创建的 UDT/UDP 套接字。

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

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

在引用的“UDT Hole Punching Pattern”中不完美的是,UDT 套接字绑定到一个固定的参数地址;更好的办法是将socket绑定到端口0,系统会分配一个合适的动态端口,可以通过getsockname()检索到,然后在P2P模式下重复使用。

【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多