C# socket跨路由通信

C# socket跨路由通讯
局域网通讯
局域网的一台PC机作为ServerSockt端,此PC机以及和它在一个路由的其他机器,都是静态分配IP地址,网段为194.194.194.x
另外,局域网安装了路由器,IP地址为192.168.0.11,在此wifi下的笔记本能够和194.194.194.x网段的pc机互联

现象
从194.194.194.x的pc机能发消息到192.168网段的客户端,反过来消息发不过去。
请问,socket(tcp协议)怎么解决跨路由通讯?
------解决思路----------------------
路由器分内网和外网
外网的机器要作为server端开侦听
内网的机器作为clint端建立长连接
然后就可以互发消息了

如果外网的机器想主动连接内网的机器,必须做IP地址映射,将外网IP映射成内网IP
------解决思路----------------------
比如将194.194.194.1映射成192.168.0.1
那么在外网访问192.168.0.1,就相当于访问194.194.194.1
------解决思路----------------------
所谓都在一个局域网,这种说法是不对的
根本就是在两个局域网里
内网访问外网,统一用的同一个IP192.168.0.11
外网访问内网,根本访问不了
IP段都不一样了,还说在一个局域网里
照你的想法,我现在的电脑跟你现在的电脑,还都在一个局域网里呢,不过中间用了很多路由器连起来了而已嘛
------解决思路----------------------
如果仅仅是因为"端口不够用"这种需求
你把网线统一插在LAN口上不好吗,这样大家都在一个IP段里,直接就能访问了
不要在WAN口插网线
------解决思路----------------------
这种事与C# socket编程无关

研究一下网络配置,主要是WIFI路由防火墙设置,DHCP等。

为方便,最好所有客户端配到同一子网下

------解决思路----------------------
客户端访问服务器,然后双方就能双向通讯了。如果客户端检测到网络断了,就会重连。

服务器从来不连客户端!
------解决思路----------------------
如果说到具体的应用软件,首先,客户端都会连到公共的服务器去进行业务操作,这时候如果客户端发消息给服务器、或者服务器发消息给客户端(注意这里指长连接,而不是短链接)都是几毫秒的事情,很快。

假设客户端A有消息要发给B,可以把消息给服务器,然后服务器就把消息给B了。也就是几十毫秒就到达对方了。

进一步,如果你把上述已经做起来了,基本的通讯完全连好了,有闲功夫的时候,才开始考虑更加“性能”或者更加“省资源”的改进方式。例如可以修改客户端登录机制,让客户端登录时,报告内部局域网测试结果,并且开一个局域网内动态端口用于接收内部消息。然后通讯时A会先从服务器获取B的部分局域网内部端口,然后先尝试访问B;如果访问超时,那么以后跟B的通讯就还是使用服务器。

QQ在tcp联通的情况下,还是会使用udp发送部分聊天消息,然后等待tcp的回应。这样的目的就是为了发消息快一点。同时QQ也会大量使用http方式。但是这一切的基础,都是先要保证业务连通,也就是先用最可靠的方式(而不是什么网上说的最快的方式)建立起来。如果连基本的稳定性都不能保证,那么什么就不能瞎试别的“技术”。
------解决思路----------------------
连基本的稳定性都不能保证,你会看到很多人先去瞎掰什么“udp打洞”。可是你要是测试一下他们的实际的程序,90%是根本不能用的,剩下的90%是根本不稳定的。
------解决思路----------------------
90%是根本不能用的,剩下的90%是根本不稳定的  -->   90%是根本不能在多层交换网络下连通的,剩下的90%是根本不稳定的
------解决思路----------------------
你要记得,使用了路由器,就不再是局域网了,而是分内网和外网
那么你应该用外网和内网通信的思路去编程,而不是一味的纠结什么局域网
要么放弃点对点通信,统一使用服务器中转转发信息
要么学习一下NAT穿透的知识

而且你的应用中,还不完全是在两个局域网内的两台计算机通信,
而是其中一台在外网,另一台在内网
其实你只要区分出到底哪一台在外网,将外网的计算机开启侦听(作为服务端),内网计算机作为客户端去连接就能够连接上了
不要企图让外网的计算机作为客户端主动连接内网的计算机,不做NAT穿透根本就连接不上
------解决思路----------------------
你要画拓扑图的话,涉及到Router的,起码要标出网段,这样才能看出到底哪根线插在LAN口,哪根线插在WAN口上
而且A能发消息给2,发的是什么消息,QQ消息吗???
------解决思路----------------------
而且hub到底是个什么东西,我完全不理解
你这是从多么古老的书上抄来的东西啊
现在市面上根本就不存在这个产品了吧
这还是在交换机发明之前的产物
使用的根本不是TCP/IP协议
而是总线协议,使用竞争机制
------解决思路----------------------
HUB中文名称是集线器
也就是内部单纯的把网线里面的线芯都并联在一起了而已
根本无法分组交换
所有网卡都是采用直连的方式接在一起了
------解决思路----------------------
也就是说,1,2接在LAN口,A,B,C接在WAN口?
还是说你的TPLink有多个WAN口,1,2各接到一个WAN口上?
2上运行的是server端,A上运行的是clint端??
理论上从Aping2根本就ping不通才对
------解决思路----------------------
引用:
Quote: 引用:

而且hub到底是个什么东西,我完全不理解
你这是从多么古老的书上抄来的东西啊
现在市面上根本就不存在这个产品了吧
这还是在交换机发明之前的产物
使用的根本不是TCP/IP协议
而是总线协议,使用竞争机制


哈哈,拓扑图是根据我的认识画的,没有抄书本C# socket跨路由通信
Hub我称之为转发器或者集线器,就是同一个办公室多台pc机网线连接的一个设备

应该是switch才对吧,一个二层小交换机而已
如果真的仅仅是集线器,你这样接根本就不会通
------解决思路----------------------
其实就是交换机
先不纠结名字的问题,回答我25楼的问题,TPLink到底怎么接线的,哪个是WAN口,哪个是LAN口