tcp打洞的关键有关问题,向做过的高手请问

tcp打洞的关键问题,向做过的高手请教

我理解的tcp打洞的过程如下:

设立一个公网的服务器端S并且监听

设立两个私网的客户端CA和CB

CA和CB创建socket ca_socket和socket cb_socket向服务器端S连接,

如 connect(ca_socket,s)和connect(cb_socket,s)

服务器端S获取客户端CA和CB的公网IP和端口,

交换传回CA和CB(也就是CA的公网IP和端口传给CB,把CB的公网IP和端口传给CA)

我的问题是:ca_socket和cb_socket其中一个能不能设定为listen(ca_socket){或者listen(cb_socket)},

然后accept(ca_socket){或者accept(ca_socket)}

也就是其中一个私网socket由客户端变成服务器端,让另个私网socket来连接

=====================================

请问这种同一个socket先当客户端,然后转变为服务端(先connect,后listen和accept)能行吗?

网上搜索了一下,有的说行,有的说不行,我也不知道具体行不行的理由

请做过TCP打洞的高手指点一下,谢谢



------解决方案--------------------
TCP的穿透不是这么简单的,UDP可以在socket层面实现,而TCP是不行的.首先要理解3次握手,然后才能进行下一步.TCP的穿透是建立在原始socket上,前面的SYN包都是自己来发.可以百度下看看相应的论文.如果是UDP就简单多了.
------解决方案--------------------
http://hi.baidu.com/xiandanshiyi/item/80c3ac57de92f59c08be1755
------解决方案--------------------
最近也在做这个TCP穿越NAT。与楼主的情况很相似。表示很无奈。
找了大量的资料,原理也就无非是:
1、服务器S将A的地址与端口发送给B,A在与服务器连接的端口上创建、绑定套接字,连接B(此时连接失败);
2、服务器S将B的地址与端口发送给A,B在与服务器连接的端口上创建、绑定套接字,连接A(连接成功?);
接下来的问题说是因为A和B已经在和服务器S建立连接时绑定了本地端口,当A和B再想和对方建立连接时,绑定到同一个端口就不行了,需要调用setsockopt给它传一个SO_REUSEADDR以使端口能重用是吧?但在这里我特定测试了一下下,我就不调用,但结果显示bind能绑定啊,我晕,什么情况?
上面这两步我都做到了。但当收到对方的地址和端口时,不论是A去connect B还是反过来,connect均失败。GetLastError均返回10022错误代码,资料显示意思是:
提供了非法参数(例如,在使用setsockopt()函数时指定了非法的level)。在一些实例中,它也可能与套接字的当前状态相关,例如,在套接字没有使用listen()使其处于监听时调用accept()函数。

但是按照资料上面介绍的去做的话,打洞时A和B并没有调用到accept()函数啊,只是收到对方的节点信息之后就去connect。

------解决方案--------------------
也看了些资料,好像tcp打洞基本处于实验室阶段吧,商用不是很靠谱,和网关类型有很大关系。
现实互联网上好像不大好实现,要看运气,情况较复杂,编程也很费劲,需要考虑的情况较多。
不过,看过一篇文章,好像是使用raw socket设置ttl的方法,基本可以通用,但是也不容易,不知道具体实现如何

期待大神