我现在遇到一个很头痛的问题,百度了很久,还是没找到原因和解决办法,所以只能求助万能的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.   

    朋友,有问题你干嘛要死查百度呢,还有Google呢,那个是学习的好网站。
    以后娱乐用百度,学习用Google!!!
    呵呵!!!
      

  2.   

    我用的就是google 只是百度说的比较顺口 嘎嘎
      

  3.   

    如果是一般PC机上的个人防火墙 很多应该有通讯时是否添加例外的主动提示
    如果你无法知道B节点到底用的是那种防火墙 只想改进下程序就能完全绕过B点所有可能存在的防火墙 那防火墙的存在还有什么意义
      

  4.   

    我觉得你的模型有问题导致这样的结果。
    你让B也做服务端,当然就会存在B的服务端口被防火墙拦截的可能。正常的udp模型应该只是在A节点做服务器。B始终是作为客户端请求连接A。
      

  5.   

    第一个包本来就是B发给A的啊 A的返回包没法到达B
      

  6.   

    3.如果B节点的环境有防火墙,B节点发送给A节点的数据包没有问题,但是A节点返回给B节点的包,B节点却收不到-----
    这里有几个可能,一个是防火墙已经完全禁止了外部的UDP包数据,这种无法处理另外一种是必须B节点以portB端口为源端口向A节点的目标端口portA发送数据,这时防火墙才会打开在一定时间内允许A的以portA为源端口向portB的portB发送数据。
      

  7.   

    问题已经找到了,现在把经验说一下,希望能帮到和我碰到同样问题的人1.因为B节点的路由器在数据包出去之前会给数据包镜像一个另外的IP和port,所以B节点发送给A节点的数据包的源port就已经不是1001,而是一个随机的port;
    2.而A节点在返回包的时候却仍然是已1001为目的端口回包,这样,B节点的路由器根本不认识这个包,所以将包丢弃;我们现在的做法:
    1.A节点将所有收到的包的源端口作为目的端口回包;
    2.如果多个B节点都在与A节点通信,那么A节点会建立多个对象分别代表每一个B节点,而每一个对象里面记录该B节点发送包的源端口;
    3.A节点在返回包的时候,包是发送给谁的就会调用谁的源端口作为目的端口发包。