2

我目前可以通过这样做来收听我编写的一个简单的广播服务器(它只是广播“你好”):

int fd = socket(PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
add.sin_family = AF_INET;
add.sin_port = htons(10074);
bind(fd, struct sockaddr*) &addr, sizeof(addr));

char buf[800];
recvfrom(fd, buf, sizeof(buf), 0, NULL, 0);

我想知道的是,上面将使用什么接口?某种默认?以及如何更改我收听广播的界面?我通过设置imr_address和结构imr_ifindex在多播中看到了它,ip_mreqn但我不确定是否有广播的等价物。

4

2 回答 2

2

如果要侦听由interface name标识的特定接口,可以使用getifaddrs将接口名称映射到一组套接字地址,然后将套接字绑定到每个这样的地址。(一般来说,每个地址可能需要绑定多个套接字;接口可以有多个地址。)

不过,通常最好按地址配置监听器,让内核担心哪个地址对应哪个接口。这种方式与其他基于 IP 的服务是一致的,并且系统管理员已经习惯了。

于 2013-11-20T16:12:13.657 回答
2

如果您想更改您侦听的端口,只需在您的地址中选择一个特定地址sin_addr(您当前将其保留为 0memset而不是显式分配INADDR_ANY)。该地址应该是您的 IP 地址之一,并且将自动从中选择接口。

于 2013-11-20T16:07:41.760 回答