gpt4 book ai didi

c - 绑定(bind)到选定的接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:53 25 4
gpt4 key购买 nike

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

最佳答案

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

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

  2. 一个可能对您有用的偷偷摸摸的技巧:您可以打开一个套接字并绑定(bind)到相同的端口和环回地址 127.0.0.1 或环回接口(interface)。然后打开第二个套接字到绑定(bind)到 0.0.0.0 INADDR_ANY 的同一端口。然后你忽略第一个套接字——它会捕获任何进入环回接口(interface)的数据包,因为它是一个更具体的绑定(bind)。来自其他任何地方的数据包将在第二个套接字上结束。

您需要使用 SO_REUSEADDR 选项来允许这样做,我会将第一个套接字接收缓冲区设置为一个较小的值。如果使用 TCP,您至少必须在第一个套接字上执行 listen()。

关于c - 绑定(bind)到选定的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33914391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com