日期:2014-05-16  浏览次数:21018 次

linux中UDP绑定端口的问题。
先说在局域网中的情况

我的主机IP是192.168.1.116,服务器的IP是192.168.1.127.

在做一个UDP间的通讯程序时,为了让主机以固定的端口号与服务器通讯,这时我特意绑定了我主机的一个端口比如这里是26327
。与我这个程序通讯的服务器程序绑定的端口号为6010.
现在也就是说我要从 192.168.1.116:26327 -> 192.168.1.127:6010 发送UDP数据报。

在局域网中测试正常,接到数据后的端口与之相对应。

当我把程序从局域网转到广域网上时,就出现问题了,我主机的地址比如说是111.222.333.1:26327,服务器的地址比如说是66.123.456.1:6010.
这时两端的通讯就变成这样:111.222.333.1:26327 -> 66.123.456.1:6010
这时在服务器端接到的地址结构转换后,端口号与之不对应。这是为什么?我明明绑定了26327,可虽显示的确是一个随机端口号。这是为什么?

请高手指点,我现在初步想可能是我的数据报在发送到服务器时。我的主机先把数据报发送到局域网的网关。而网关这边会分了另一个端口号与之串联。并且用该端口号与局域网中我的主机建立一个映射关系。所以在服务器那边收到的端口号是网关随机分配的一个未被使用的端口号。不知道我这样理解是否正确。

------解决方案--------------------
你的描述有一个地方没有表述清楚,服务器接收收到包解析出来的包源地址的IP还是111.222.333.1吗?
如果不是,那就是应该如你理解的一样,应该是网关转换的结果。如果源地址IP还是111.222.333.1,那就说没有经网关转换。哪没经网关转换,那你的端口就不应该改变。看上去有点自相矛盾.