我刚刚在哪个适配器上收到此 UDP 数据包?
我正在尝试用 C# 编写一个 BOOTP 服务器。
我正在接收并解析来自客户端的 BOOTP 数据包,我需要回复我的服务器 IP 地址。
问题是:
- 计算机可以有多个网络适配器
- 客户端还没有 IP 地址
有什么方法可以查明 UDP 数据包是在哪个适配器上接收的?
I'm trying to write a BOOTP server in c#.
I'm receiving and parsing the BOOTP packet from the client and I need to reply with my server IP address.
The problem is:
- The computer can have multiple network adapters
- The client doesn't yet have an IP address
Is there any way to find out what adapter the UDP packet was received on?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有几种可能的方法可以做到这一点。在每个物理接口上的每个 IP 上绑定一个单独的套接字,然后您将始终知道数据包到达哪个接口。您还可以尝试将 IP_RECVIF 标志与 recvmsg 套接字函数一起使用,尽管我不知道 Windows 是否支持。 Steven's 在《Unix 网络编程》第 22.2 和 22.6 节中提供了示例。您可以将 SIOCGIFCONF 标志与 ioctl 一起使用来获取计算机上的接口列表。 UNP 第 17.6 节中有一个示例程序。如果 C# 不允许您访问这些函数,但它们在 Windows 上受支持,您可以编写一个简单的 C 程序来收集和更新接口/IP 信息,然后使用 mmap 在 C# 程序和接口枚举器之间共享内存区域。
There are a few possible ways to do this. Bind a separate socket on each IP on each physical interface, then you'll always know which interface the packet arrived on. You can also try the IP_RECVIF flag together with the recvmsg socket function, although I don't know if that's supported on Windows. Steven's has examples in Section 22.2 and 22.6 of Unix Network Programming. You can use the SIOCGIFCONF flag with ioctl to get a list of interfaces on the machine. There is an example program in UNP section 17.6. If c# doesn't give you access to these functions but their supported on Windows you could write a simple C program to collect and update the interface / IP info and then use mmap to share a memory region between your C# program and the interface enumerator.