我一直在用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进行绑定的目的是指定在本地本地绑定套接字的位置,那么您是否可以传入特定接口的IP地址以将套接字绑定到该接口?我希望有人能弄清楚套接字在这里做什么,以及在绑定之前该方法和使用setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, &devicename, sizeof devicename);
之间的区别是什么。
注意:在上面的示例中,为简单起见,我使用了UDP并删除了错误检查,理想情况下,上述问题的答案应该能够独立于所使用的协议而工作。
答案 0 :(得分:0)
如果传入sockaddr进行绑定的目的是指定要在哪里绑定 将套接字本地绑定到您的计算机本地,是否可以传入IP 将套接字绑定到特定接口的地址?
绑定到地址(通过bind()
)和绑定接口(通过setsockopt()
)具有不同但重叠的目的。通常bind()
是您想要的。
特别是,您的问题似乎假设地址和接口之间存在1:1映射,但这并不是一个安全的假设。一个接口可以具有多个地址,并且至少从原则上讲,一个地址可以由多个接口提供服务。