![]() |
1
30
Nikolai认为,为每个地址使用单独的套接字和绑定(2)或搞乱路由表通常是不可行的选择,例如使用动态地址。单身汉
幸运的是,还有另一种方法。根据系统的支持,您可以使用
链接中的代码使用
吉恩,你的问题是如何设置发送数据包的源地址。与
另请注意,Windows不支持in_pktinfo结构中与ipi_spec_dst等效的,因此不能使用此方法设置传出winsock2数据包的源地址。 (参考手册页-约1个超链接限制)
|
![]() |
2
20
我想我应该扩展杰里米的关于如何在IPv6上做到这一点的内容。Jeremy遗漏了很多细节,一些文档(比如Linux的ipv6手册页)完全是错的。首先,在某些发行版上,您必须定义\u GNU \u SOURCE,否则一些IPv6内容没有定义:
注意上面的代码为IPv6套接字设置了IP和IPv6选项。结果表明,如果数据包到达IPv4地址,即使它是IPv6套接字,您也将获得IP地址信息(即IPv4)cmsg,如果您不启用它们,它们将不会被发送。另外请注意,IPV6\u RECPKTINFO选项已设置(中未提及) ),而不是IPV6\u PKTINFO(在 城域网7 ipv6
下一步是从cmsg中提取接收到的UDP数据包的接口和地址:
最后,我们可以使用相同的目的地将响应发送回。
再次注意,如果数据包是通过IPv4传入的,那么我们必须将IPv4选项放入cmsg,即使它是AF\u INET6套接字。至少,这是您必须为Linux做的事情。 这是一个惊人的工作量,但至少你要做的是使一个健壮的UDP服务器在所有可能的Linux环境中工作。TCP不需要它,因为它透明地处理多宿主。 |
![]() |
3
4
你也是
我的问题是-你为什么需要这个?正常的IP路由对您不起作用吗? |
![]() |
4
0
我解决这个问题的方法是
|