套接字错误:90:消息太长
我在以下 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?或者我错过了什么?
I have an error from the following scenario with IGMP socket call;
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;
}
the sendto call fails saying Message too long.
I am using 8192 as the buffer size. So I tried using the following call to fix this error;
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( ) call succeeds but the same error for sendto();
So i checked the SO_SNDBUF size with getsockopt( ) call and it shows 1 byte ?!
What is wrong I am doing.
Does the Linux kernel need recompile for IGMP support ? or I am missing something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
以太网(您最有可能使用的链路层)帧通常为 1500 字节长。为
send()
提供消息的确切大小,而不是缓冲区大小。SO_SNDBUF
是内核中的每个套接字缓冲区,它告诉 TCP 需要缓冲多少,限制 UDP 数据报的大小,并且对于原始套接字没有任何意义。Ethernet (the link layer you are most probably working against) frame is usually 1500 bytes long. Give the
send()
the exact size of the message, not the buffer size.SO_SNDBUF
is the in-kernel per-socket buffer, which tells how much to buffer for TCP, limits the size of datagram for UDP, and does not make any sense for raw sockets.