6

在 IGMP 套接字调用的以下场景中出现错误;

fd = socket(PF_INET,  SOCK_RAW, IPPROTO_IGMP) ;
setsockopt( fd, IPPROTO_IP, IP_HDRINCL, nval, sizeof(nval) );
/** Fill in the IP header and Ethernet header**/
/*** Fill, create the IGMP packet structures***/
if(sendto( fd, &buf, sizeof(buf), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0) {
    printf("Socket Sendto error %d : %s\n", errno, strerror(errno));
    return 0;
}

sendto 调用失败,提示消息太长。我使用 8192 作为缓冲区大小。所以我尝试使用以下调用来修复此错误;

if(setsockopt(dlpifd, IPPROTO_IP, SO_SNDBUF, &val, sizeof(int)) < 0) {
   printf("Can't set socket options:%d:%s\n", errno, strerror(errno));
   return 0;`
}

setsockopt() 调用成功,但 sendto() 出现相同错误;

所以我用getsockopt()调用检查了SO_SNDBUF的大小,它显示1字节?!

我在做什么错。

Linux 内核是否需要重新编译以获得 IGMP 支持?或者我错过了什么?

4

1 回答 1

7

以太网(您最有可能使用的链路层)帧通常为 1500 字节长。给出send()消息的确切大小,而不是缓冲区大小。

SO_SNDBUF是内核中的每个套接字缓冲区,它告诉 TCP 缓冲多少,限制 UDP 数据报的大小,并且对原始套接字没有任何意义。

于 2011-01-25T16:11:28.367 回答