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