打洞的问题
额嗯....小弟对于打洞不是很了解,在此想问点问题.
1. Tcp是不是不能如udp那样bind了之后就可以从指定的端口发出数据了?
2. Udp打的洞, 能用Tcp进行链接么? 关于这个问题以前在论坛上有过讨论,但是我这个菜鸟还是不能明确到底是可行还是不可行,原文如下
http://topic.csdn.net/u/20090228/17/bb871cbd-a9f4-4640-9cb7-3b427fadc99f.html
3. 额嗯那个, 对于Tcp打洞在网上有一篇文章, 其中一些描述我有很多困惑, 大致是这样的.
假设某A子网下有客户端a, B子网下有客户端b, 公网上有服务端s.
a) a,b分别主动连接s(Tcp连接), 这样s就可以知道a, b经过Nat转化后的ip和端口号.
b) s把a经过Nat转化后的ip和端口号告诉b, 把b经过Nat转化之后的ip和端口号告诉a.
c) a从s那得到b经过Nat转化后的ip和端口号后连接b, b同样也连接a, 然后A和B就各自打了一个洞,下次就可以直接通讯了
对于这里面的叙述的, 第三点中,a连接b, b连接a的时候似乎是不能打洞的, 因为a去连接b的时候, b根本不知道a发起对b
的tcp链接经过Nat转化后的新的端口号(知道的只是a连接s时候用的ip的端口,而a发起对b的链接的时候的端口号是未知
的), 同样的a也不知道b发起对a的tcp链接经过Nat转换之后的端口号.所以我认为按照这样的叙述的做法是行不通的.
我这样理解是不是错了?
我现在先当自己前面的分析是对的, 那么现在遇到的问题就是两个客户端之间如何得知彼此进行Tcp连接时候, Nat转换之
后的端口号, 对于这点我想到了udp, udp在bind之后不是就以bind的端口号发送数据的么?这样我就可以知道发起连接时所
使用的端口号了,于是乎有了上面第二个问题...udp打的洞,可以不可以用Tcp连接?
[解决办法]
网上可以下载到p2p打洞方面的简单源代码,楼主可以研究下
[解决办法]
a和b都有两个endpoint,一个是内网的,一个是外网的,a和b连接s的时候用的是外网的ip和port,但是自带的消息体中也包含了内网的ip和port,如果a想tcp连接b时,s会把a的外网的ip和port告诉b,b会拿这个ip和port去打洞 (外网的ip和port就是经Nat转化的ip和port)