我现在遇到一个很头痛的问题,百度了很久,还是没找到原因和解决办法,所以只能求助万能的CSDN了前提:
1.我现在做了一个通讯系统,走的是UDP协议;
2.两个节点之间谁都可以是服务端或者客户端,因为谁都可以主动向对方发送数据包,且都可以不回复;
3.两个节点是两个不同的程序,各自绑定了自己的端口,假设A节点绑定的是1000号端口,B节点绑定的是1001号端口;
4.通讯时A节点发送的数据包的源端口是1000号端口,目的端口是1001号端口,B节点反之;
5.A节点是固定的地方,所以在A节点处,防火墙会将所有指向1000号端口的数据包打到A节点上;
6.B节点可以是全国任意一台能连接到以太网的PC机,无法要求B节点的使用者将防火墙的配置也配的和A节点一样;问题:
1.在内网通讯,一切正常;
2.如果B节点的环境没有防火墙,一切正常;
3.如果B节点的环境有防火墙,B节点发送给A节点的数据包没有问题,但是A节点返回给B节点的包,B节点却收不到(在A节点的防火墙上抓包会看到B节点的数据包进来了,且A节点的返回包也出去了,但是在B节点的PC上却抓不到A节点的返回包,由于条件有限,没办法在B节点的防火墙上抓包,所以也不能肯定是B节点的墙把数据包丢弃了,也有可能是在半路中就被丢弃了,但是从上一点看的话,被B节点防火墙丢弃的可能性最大)不知道我这样的说明有没有很清楚,我一直在线,如果谁不明白,我会及时回复的,先谢谢啦!如果能帮我解决这个问题,我会加分的!
1.我现在做了一个通讯系统,走的是UDP协议;
2.两个节点之间谁都可以是服务端或者客户端,因为谁都可以主动向对方发送数据包,且都可以不回复;
3.两个节点是两个不同的程序,各自绑定了自己的端口,假设A节点绑定的是1000号端口,B节点绑定的是1001号端口;
4.通讯时A节点发送的数据包的源端口是1000号端口,目的端口是1001号端口,B节点反之;
5.A节点是固定的地方,所以在A节点处,防火墙会将所有指向1000号端口的数据包打到A节点上;
6.B节点可以是全国任意一台能连接到以太网的PC机,无法要求B节点的使用者将防火墙的配置也配的和A节点一样;问题:
1.在内网通讯,一切正常;
2.如果B节点的环境没有防火墙,一切正常;
3.如果B节点的环境有防火墙,B节点发送给A节点的数据包没有问题,但是A节点返回给B节点的包,B节点却收不到(在A节点的防火墙上抓包会看到B节点的数据包进来了,且A节点的返回包也出去了,但是在B节点的PC上却抓不到A节点的返回包,由于条件有限,没办法在B节点的防火墙上抓包,所以也不能肯定是B节点的墙把数据包丢弃了,也有可能是在半路中就被丢弃了,但是从上一点看的话,被B节点防火墙丢弃的可能性最大)不知道我这样的说明有没有很清楚,我一直在线,如果谁不明白,我会及时回复的,先谢谢啦!如果能帮我解决这个问题,我会加分的!
以后娱乐用百度,学习用Google!!!
呵呵!!!
如果你无法知道B节点到底用的是那种防火墙 只想改进下程序就能完全绕过B点所有可能存在的防火墙 那防火墙的存在还有什么意义
你让B也做服务端,当然就会存在B的服务端口被防火墙拦截的可能。正常的udp模型应该只是在A节点做服务器。B始终是作为客户端请求连接A。
这里有几个可能,一个是防火墙已经完全禁止了外部的UDP包数据,这种无法处理另外一种是必须B节点以portB端口为源端口向A节点的目标端口portA发送数据,这时防火墙才会打开在一定时间内允许A的以portA为源端口向portB的portB发送数据。
2.而A节点在返回包的时候却仍然是已1001为目的端口回包,这样,B节点的路由器根本不认识这个包,所以将包丢弃;我们现在的做法:
1.A节点将所有收到的包的源端口作为目的端口回包;
2.如果多个B节点都在与A节点通信,那么A节点会建立多个对象分别代表每一个B节点,而每一个对象里面记录该B节点发送包的源端口;
3.A节点在返回包的时候,包是发送给谁的就会调用谁的源端口作为目的端口发包。