我的应用程序使用" sockaddr_ll.sll_ifindex = 0"绑定到所有接口。我想要的是将套接字绑定到选定的接口(例如eth0,eth1,eth4)或绑定到除loopback之外的所有接口。 创建多个套接字的第一个解决方案对我来说真的很难,因为我使用环形缓冲区。我试图找到一些解决方案但到目前为止没有运气。 欢迎任何建议。
答案 0 :(得分:1)
没有简单的方法可以完全按照自己的意愿行事。几个选项:
打开多个套接字并使用select()和recv()/ recvfrom()/ read()/ etc。要在同一个地方接收多个fds,你可以单独使用recv()。这是直接的解决方案,它是冗长的,但可以在功能上等同于从单个插槽读取。它更适合生产可维护的代码。
一个可能适用于您的偷偷摸摸的技巧:您可以打开一个套接字并绑定到同一端口和环回地址127.0.0.1或环回接口。然后打开第二个套接字到绑定到0.0.0.0 INADDR_ANY的同一个端口。然后你忽略第一个套接字 - 它将捕获回送接口上的任何数据包,因为它是一个更具体的绑定。从其他任何地方进来的数据包将最终出现在第二个插槽上。
您需要使用SO_REUSEADDR选项来允许此操作,并且我会将第一个套接字接收缓冲区设置为较小的值。如果使用TCP,则必须至少在第一个套接字上使用listen()。