从c中的特定接口发送数据包

Send packets from a specific interface in c

我一直在用 c 语言进行一些套接字编程,我想让我的程序的用户指定从中发送和接收数据包的接口。 socket(7) 的 linux 手册页说您可以设置套接字选项 SO_BINDTODEVICE 以将套接字绑定到特定设备,例如 "eth0"。我还想到,在调用 bind() 时,您通常会向它传递一个 sockaddr_in 结构,其中 sin_addr.s_addr 属性 设置为 INADDR_ANY 以告诉套接字绑定到所有接口如下图

int sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

struct sockaddr_in local;

local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0;

bind(sd, (struct sockaddr *)&local, sizeof local);

如果传递 sockaddr 到 bind 的目的是指定在你的机器上本地绑定套接字的位置,你可以只传递一个特定接口的 IP 地址来将你的套接字绑定到它吗?我希望有人能澄清套接字在这里做什么,以及这种方法与在绑定之前使用 setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, &devicename, sizeof devicename); 之间的区别。

注意:在上面的示例中,为了简单起见,我使用了 UDP 并删除了错误检查,理想情况下,上述问题的答案应该能够独立于所使用的协议工作。

If the point of passing in the sockaddr to bind is to specify where to bind the socket locally on your machine, could you just pass in the IP address of a specific interface to bind your socket to it?

绑定到一个地址(通过bind())和绑定到一个接口(通过setsockopt())服务于不同但重叠的目的。通常bind()就是你想要的。

特别是,您的问题似乎假设地址和接口之间存在 1:1 映射,但这不是一个安全的假设。一个接口可以有多个地址,至少在原则上,一个地址可以由多个接口服务。