您好,
我们现有的程序是一个聊天软件,使用同一个端口与服务器以及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发现本机并未向新端口发送数据包,怀疑是参数设置错误。
希望您能指出问题的所在指出,非常感谢!
张璨
我也遇到同样的问题,谷先生,能帮忙解释一下吗?
同样的问题,通过udp socket穿透NAT后,再用UDT::bind2(UDTSOCKET,UDPSOCKET),使用UDT_RENDEZVOUS模式,然后UDT::connect对方的NAT地址,返回" Connection setup failure: connection time out",请谷大大详细说下,谢谢。
<BODY>
我最喜欢淘东西了,最近运气好,前几天看到这个活动,拍了两双,没想到发过来去专柜检验确实是正品~赚了~还有情侣款!http://dfhtdh.gxsl.net
This is an automatic reply, confirming that your e-mail was received.Thank you
楼上丧心病狂,发垃圾广告发到这来。
Log in to post a comment.
您好,
我们现有的程序是一个聊天软件,使用同一个端口与服务器以及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发现本机并未向新端口发送数据包,怀疑是参数设置错误。
希望您能指出问题的所在指出,非常感谢!
张璨
我也遇到同样的问题,谷先生,能帮忙解释一下吗?
同样的问题,通过udp socket穿透NAT后,再用UDT::bind2(UDTSOCKET,UDPSOCKET),使用UDT_RENDEZVOUS模式,然后UDT::connect对方的NAT地址,返回" Connection setup failure: connection time out",请谷大大详细说下,谢谢。
<BODY>
</body>
</html>
<BODY>
</body>
</html>
<BODY>
</body>
</html>
楼上丧心病狂,发垃圾广告发到这来。