套接字错误:90:消息太长

发布于 2024-10-14 19:24:20 字数 865 浏览 8 评论 0原文

我在以下 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

前事休说 2024-10-21 19:24:20

以太网(您最有可能使用的链路层)帧通常为 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文