• 9345阅读
  • 7回复

在server中如何让两个socket互相连接 [复制链接]

上一主题 下一主题
离线signallock
 

只看楼主 倒序阅读 楼主  发表于: 2009-01-22
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
想实现一个功能:在一个QTcpServer继承类里面,有很多线程,每一个线程与一个客户端用QTcpSocket继承类相互连接,现在希望能让两个QTcpSocket互相连接,不通过server,Qt可以实现么?

有时候聊qq,开启语音聊天或者传输文件,都会看见“已经与对方直接建立的TCP连接”这样的提示,而且即使断线,我和他仍然能语音,传文件,因为我们虽然与Internet断开了,但是还是在同一个局域网里面。这样“与对方直接建立的TCP连接”的技术怎样用Qt实现呀?

好像通过获取两个QTcpSocket的ip,之后让其中一个做server,这样不大行,因为如果两个客户端在同一个局域网里通过路由上Internet,那他们对外的ip有可能是一样的,这取决于路由器的路由协议,如果要让一个做server的话,还需要在路由器里绑定服务端口……
离线roc496
只看该作者 1楼 发表于: 2009-01-22
我个人觉得是先由服务器把你们的ip告诉对方了
然后由客户端自己建立连接的
之后虽然和服务器断开连接了
但你们的ip都相互知道了
不然你怎么把你的ip告诉人家啊?
离线signallock

只看该作者 2楼 发表于: 2009-01-22
可是即便是两个客户端互相知道对方的ip,如果客户机都通过路由上互联网的话,其中一个做server,是需要路由器的端口绑定的。像学校这样的机构,不大可能随随便便就绑定端口呀

比如,在局域网里面,A的IP是192.168.1.100,B的IP是192.168.1.105,他们通过同一个路由器上网,那么我server这里接受到的IP是一样的,都是那个路由器的WAN口IP,就不能直接告诉客户端server里面的IP,让他们互联了
离线roc496
只看该作者 3楼 发表于: 2009-01-22
不用的
我那天也是你这么认为的
后来问了个德国留学生
他说如果发现互联两端是本地局域网
系统会给你自动转成本地ip
就那个192.168.1.xxx那个
离线signallock

只看该作者 4楼 发表于: 2009-01-22
哦??不错……
多谢^o^
只看该作者 5楼 发表于: 2009-01-22
引用楼主signallock于2009-01-22 14:19发表的 在server中如何让两个socket互相连接 :
想实现一个功能:在一个QTcpServer继承类里面,有很多线程,每一个线程与一个客户端用QTcpSocket继承类相互连接,现在希望能让两个QTcpSocket互相连接,不通过server,Qt可以实现么?
有时候聊qq,开启语音聊天或者传输文件,都会看见“已经与对方直接建立的TCP连接”这样的提示,而且即使断线,我和他仍然能语音,传文件,因为我们虽然与Internet断开了,但是还是在同一个局域网里面。这样“与对方直接建立的TCP连接”的技术怎样用Qt实现呀?
好像通过获取两个QTcpSocket的ip,之后让其中一个做server,这样不大行,因为如果两个客户端在同一个局域网里通过路由上Internet,那他们对外的ip有可能是一样的,这取决于路由器的路由协议,如果要让一个做server的话,还需要在路由器里绑定服务端口……

这……你没把tcp协议弄清楚吧

tcp通讯必须具有客户端和服务器端,QTcpSocket是给你写客户端用的,你不可能让两个客户端通讯啊,只有让其中一个做服务器端
离线signallock

只看该作者 6楼 发表于: 2009-01-23
我知道是要一个做服务器,我的意思是已经有两个socket,怎么让让这两个socket连接的客户端互相连接。roc的方法刚才试了一下,好像不行呀,server里面接受的ip都是172.18.*.*,但是两个是通过路由上的,其中一个局域网内ip是192.168.1.100,另一个是192.168.1.105,用一个做server可以,但是另外一个客户端连不上172.18.*.*,因为路由器不知道该给局域网里哪个电脑连接
只看该作者 7楼 发表于: 2009-01-23
引用第6楼signallock于2009-01-23 00:21发表的  :
我知道是要一个做服务器,我的意思是已经有两个socket,怎么让让这两个socket连接的客户端互相连接。roc的方法刚才试了一下,好像不行呀,server里面接受的ip都是172.18.*.*,但是两个是通过路由上的,其中一个局域网内ip是192.168.1.100,另一个是192.168.1.105,用一个做server可以,但是另外一个客户端连不上172.18.*.*,因为路由器不知道该给局域网里哪个电脑连接

两个客户端在提交ip的时候提交一次自己的本地ip,外网ip由服务器鉴别,然后服务器告诉客户端对方的内网和外网ip,两客户端之间连接先尝试内网ip再尝试外网ip
快速回复
限100 字节
 
上一个 下一个