纯真初学者socket编程的有关问题:有图求真相

纯真菜鸟socket编程的问题:有图求真相
纯真初学者socket编程的有关问题:有图求真相
小弟初学网络编程,socket也是一知半解,什么TCP/UDP的啊,最终都要调个bind()函数。
上图中“主机A”与“主机B”通信时,bind()的IP地址可以确定,可是“主机A”或“主机B”要与“主机C”通信又该怎么办呢?
------解决方案--------------------
客户端 连 服务器时, ip填写服务器的外网ip,端口需要按你路由器上配置的端口连

至于这个外网IP和端口 怎么转成内网ip端口, 是服务器所连的路由器的事。路由器会映射ip:port 到内网具体哪台机器哪个端口。

比如你服务器的内网两个ip端口对外开放的:192.168.0.11:3001 和 192.168.0.12:3001。 然后外网的ip是11.11.11.11。
这时需要在路由器上做个配置来映射的,比如
11.11.11.11:3001 对应到 192.168.0.11:3001,11.11.11.11:3002对应到192.168.0.12:3001,

则你客户端连接的时候就填写11.11.11.11:3001 和 11.11.11.11:3002就可以了。
------解决方案--------------------
引用:
Quote: 引用:

客户端 连 服务器时, ip填写服务器的外网ip,端口需要按你路由器上配置的端口连

至于这个外网IP和端口 怎么转成内网ip端口, 是服务器所连的路由器的事。路由器会映射ip:port 到内网具体哪台机器哪个端口。

比如你服务器的内网两个ip端口对外开放的:192.168.0.11:3001 和 192.168.0.12:3001。 然后外网的ip是11.11.11.11。
这时需要在路由器上做个配置来映射的,比如
11.11.11.11:3001 对应到 192.168.0.11:3001,11.11.11.11:3002对应到192.168.0.12:3001,

则你客户端连接的时候就填写11.11.11.11:3001 和 11.11.11.11:3002就可以了。

阁下的回复令我解惑不少,甚是感激!!!
不过还有一点疑问:QQ聊天、视频、传文件等,应该不是都要经过腾讯服务器中转吧。
如果是点对点的传输,两个不同的局域网(通过互联网连接)中的不同主机可以通信,而QQ应该不能自动去改路由器的配置(也就是阁下所说的映射)吧。再以下图为例:
纯真初学者socket编程的有关问题:有图求真相
“程序猿哥哥”(主机A)想要和“QQ妹妹”(主机B)视频聊天,他俩都不会去改路由器配置吧,可是他俩就可以QQ聊天、视频、传文件等,非常好奇是腾讯如何做到的。

应该需要服务器解析一次,通过服务器保存的节点建立p2p通信,这样相比纯P2P、完全不通过服务器进行连接应该会简单很多。
至于路由器方面,你和服务器建立连接时,都是用外网IP进行通信的,路由器会自动将内部IP转化为外部IP,不需要人为设置。
------解决方案--------------------
两个在局域网内的主机是没法直接进行通信的, 需要有服务器的辅助
这是 P2P 研究的课题,主要方法是通过 打洞, UDP 打洞很简单, TCP 更为麻烦,而且还可能涉及到路由器的兼容性问题,打洞的过程中需要有服务器来辅助,打洞成功后两台局域网内的机器就可以直接通信,不需要服务器参与了。打洞失败的话一般就会把所有数据包都通过服务器进行中转。