绑定到选定的接口

时间:2015-11-25 10:42:34

标签: c linux sockets network-programming

我的应用程序使用" sockaddr_ll.sll_ifindex = 0"绑定到所有接口。我想要的是将套接字绑定到选定的接口(例如eth0,eth1,eth4)或绑定到除loopback之外的所有接口。 创建多个套接字的第一个解决方案对我来说真的很难,因为我使用环形缓冲区。我试图找到一些解决方案但到目前为止没有运气。 欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以完全按照自己的意愿行事。几个选项:

  1. 打开多个套接字并使用select()和recv()/ recvfrom()/ read()/ etc。要在同一个地方接收多个fds,你可以单独使用recv()。这是直接的解决方案,它是冗长的,但可以在功能上等同于从单个插槽读取。它更适合生产可维护的代码。

  2. 一个可能适用于您的偷偷摸摸的技巧:您可以打开一个套接字并绑定到同一端口和环回地址127.0.0.1或环回接口。然后打开第二个套接字到绑定到0.0.0.0 INADDR_ANY的同一个端口。然后你忽略第一个套接字 - 它将捕获回送接口上的任何数据包,因为它是一个更具体的绑定。从其他任何地方进来的数据包将最终出现在第二个插槽上。

  3. 您需要使用SO_REUSEADDR选项来允许此操作,并且我会将第一个套接字接收缓冲区设置为较小的值。如果使用TCP,则必须至少在第一个套接字上使用listen()。