Menu

Rendezvous模式问题 - Connection timed out

Can Zhang
2011-05-24
2014-09-26
  • Can Zhang

    Can Zhang - 2011-05-24

    您好,

    我们现有的程序是一个聊天软件,使用同一个端口与服务器以及peer通信(收+发),服务器具有中转UDP包的功能,目前我们希望使用UDT在一个另外的端口上实现文件传输。在接收方(A)选择接受文件后,执行以下步骤:(发送方为B)

    在我使用UDT连接之前,我利用原有的服务器中转机制在收发双方(A为接受方,B为发送方)各新开一个端口(文件传输专用)。具体来说:

    1)A从自己的新端口(A2)向B的原有端口(B1)发送一个空包,该包在B1收到以后(不必考虑此处的打洞问题)B就获得了A2口的公网地址;

    2)B从自己的新端口B2向A的原有端口A1发送同样的空包,该包在A1收到以后A就获得了B2的公网地址;

    3)AB各自关闭A2,B2口上的UDP socket,重新建立一个UDT socket (写这段程序的时候没发现bind的第二种模式,不知道目前的这种做法可不可以?),然后使用rendezvous模式进行连接。具体语句如下:

    (destIP,srcIP,destPort,srcPort均已设置完毕)

    ULONG destIPLong = (ULONG)((destIP->GetAddressBytes() << 24) | (destIP->GetAddressBytes() << 16) |
       (destIP->GetAddressBytes() << 8) | destIP->GetAddressBytes());

    ULONG srcIPLong = (ULONG)((srcIP->GetAddressBytes() << 24) | (srcIP->GetAddressBytes() << 16) |
       (srcIP->GetAddressBytes() << 8) | srcIP->GetAddressBytes());

    SOCKADDR_IN localAddr;
    localAddr.sin_family = AF_INET;
    localAddr.sin_addr.s_addr = htonl(srcIPLong);
    localAddr.sin_port = htons(srcPort);

    SOCKADDR_IN peerAddr;
    peerAddr.sin_family = AF_INET;
    peerAddr.sin_addr.s_addr = htonl(destIPLong);
    peerAddr.sin_port = htons(destPort);

    bool rendezvous = true;
    UDT::setsockopt(u, 0, UDT_RENDEZVOUS, &rendezvous, sizeof(bool));
    int bindRetVal =  UDT::bind(u, (SOCKADDR *)&localAddr, sizeof(localAddr));
    if (bindRetVal != 0) {
    MessageBox::Show(AnsiToManagedString((char *) UDT::getlasterror().getErrorMessage()));
    }

    int connectRetVal = UDT::connect(u, (SOCKADDR *)&peerAddr, sizeof(peerAddr));
    if (connectRetVal != 0) {
    MessageBox::Show(AnsiToManagedString((char *) UDT::getlasterror().getErrorMessage()));
    } else {
    MessageBox::Show("Connection Successful.");
    }

    运行时,bind未报错,但是connect在等待之后报错,信息为“connection timed out”。使用数据包sniffer发现本机并未向新端口发送数据包,怀疑是参数设置错误。

    希望您能指出问题的所在指出,非常感谢!

    张璨

     
  • udt

    udt - 2012-05-08

    我也遇到同样的问题,谷先生,能帮忙解释一下吗?

     
  • flyaway

    flyaway - 2014-09-25

    同样的问题,通过udp socket穿透NAT后,再用UDT::bind2(UDTSOCKET,UDPSOCKET),使用UDT_RENDEZVOUS模式,然后UDT::connect对方的NAT地址,返回" Connection setup failure: connection time out",请谷大大详细说下,谢谢。

     
    • wang hui

      wang hui - 2014-09-25
      <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=gb2312"> </HEAD>

      <BODY>

      我最喜欢淘东西了,最近运气好,前几天看到这个活动,拍了两双,没想到发过来去专柜检验确实是正品~赚了~还有情侣款!http://dfhtdh.gxsl.net


      This is an automatic reply, confirming that your e-mail was received.Thank you



      邮箱使用小提示


      想让对方更及时看到你的邮件,可以试试发到"对方手机号@163.com"。



      无需事先开通,还有短信提醒。了解网易手机邮箱详情


      </body>
      </html>

       
      • wang hui

        wang hui - 2014-09-25
        <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=gb2312"> </HEAD>

        <BODY>

        我最喜欢淘东西了,最近运气好,前几天看到这个活动,拍了两双,没想到发过来去专柜检验确实是正品~赚了~还有情侣款!http://dfhtdh.gxsl.net


        This is an automatic reply, confirming that your e-mail was received.Thank you



        邮箱使用小提示


        想让对方更及时看到你的邮件,可以试试发到"对方手机号@163.com"。



        无需事先开通,还有短信提醒。了解网易手机邮箱详情


        </body>
        </html>

         
        • wang hui

          wang hui - 2014-09-25
          <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=gb2312"> </HEAD>

          <BODY>

          我最喜欢淘东西了,最近运气好,前几天看到这个活动,拍了两双,没想到发过来去专柜检验确实是正品~赚了~还有情侣款!http://dfhtdh.gxsl.net


          This is an automatic reply, confirming that your e-mail was received.Thank you



          邮箱使用小提示


          想让对方更及时看到你的邮件,可以试试发到"对方手机号@163.com"。



          无需事先开通,还有短信提醒。了解网易手机邮箱详情


          </body>
          </html>

           
  • flyaway

    flyaway - 2014-09-26

    楼上丧心病狂,发垃圾广告发到这来。

     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.