我一直在用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并删除了错误检查,理想情况下,上述问题的答案应该能够独立于所使用的协议工作。