【发布时间】:2012-04-16 01:03:08
【问题描述】:
我的应用程序打开了一个绑定到 INADDR_ANY 的 UDP 套接字,以侦听服务器所有接口上的数据包。我正在通过同一个套接字发送回复。
但是,当从服务器发送回复时,默认 IP 由 linux 的 IP 层选择,具体取决于为数据包选择的接口。与此接口关联的 IP 可能不是此 UDP 服务器从客户端获取查询的目标地址。因此,来自服务器的回复的源 IP 与查询所用的目标 IP 不同。客户可能会对这样的回复感到不自在。
以下链接给出了 INADDR_ANY 与 UDP 的行为: http://www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html
如何更改此默认行为并在源地址中使用特定的接口 IP?这是对应用程序代码的更多控制,以决定什么是源地址。回复中的源地址与查询所用的目标地址相同也是有意义的。
【问题讨论】:
-
会多做一些工作,但是您没有考虑过使用原始套接字代替吗?然后您可以随意更改 IP 和 UDP 标头中的所有字段。
-
@JoachimPileborg 我不建议为此使用原始套接字。您基本上必须在您的应用程序中重新实现 UDP,在内核不知情的情况下选择要使用的 UDP 端口(并且可能会干扰它自己的选择),并且您需要 root 访问权限。
-
对于 UDP 选择哪个接口作为它的服务器源地址,我没有办法发言吗?
-
@superbCoder 当然有,除非我误解了您的某些要求。看看下面我的回答
-
如果自动选择的接口不是发送者发送到的那个接口,你一定有一个非常奇怪的路由表。