我正在尝试弄清楚,在设置新套接字之后,IP_MULTICAST_IF选项使用的默认值是什么。不幸的是,我的代码分段错误,我真的不知道为什么?!我是不是做错了什么,或者如何获得IP_MULTICAST_IF选项的默认值?
int sock;
struct in_addr interface_addr;
int addr_size;
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("socket() failed");
}
addr_size = sizeof(interface_addr);
if ((getsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, &addr_size)) < 0) {
perror("getsockopt() failed");
}
printf("The default interface is %s\n", inet_ntoa(interface_addr));发布于 2012-03-27 23:36:23
是我的错,我的代码没有包含。使用
#include <arpa/inet.h>它工作得很好。
发布于 2012-03-26 18:09:47
阅读适用于您的平台的ip(7)手册页。IP_MULTICAST_IF不接受给出一个struct in_addr。
在Linux上:
IP_MULTICAST_IF (从Linux1.2开始)为多播套接字设置本地设备。参数是类似于IP_ADD_MEMBERSHIP的ip_mreqn或ip_mreq结构。传递无效套接字选项时,将返回ENOPROTOOPT。IP_ADD_MEMBERSHIP (从Linux1.2开始)加入组播组。参数是一个ip_mreqn结构。struct ip_mreqn { struct in_addr imr_multiaddr;/* IP组播组地址*/ struct in_addr imr_address;本地接口的/* IP地址*/ int imr_ifindex;/*接口索引*/ };imr_multiaddr包含应用程序要加入或离开的组播组的地址。它必须是有效的多播地址(否则setsockopt(2)失败并显示错误EINVAL)。imr_address是系统用来加入多播组的本地接口的地址;如果它等于INADDR_ANY,则由系统选择合适的接口。imr_ifindex是应该加入/离开imr_multiaddr组的接口的接口索引,或0表示任何接口。ip_mreqn结构仅在Linux2.2之后才可用。为了兼容性,仍然支持旧的ip_mreq结构(从Linux1.2开始存在);它与ip_mreqn的不同之处只是不包括imr_ifindex字段。仅作为setsockopt(2)有效。
https://stackoverflow.com/questions/9869732
复制相似问题