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 呼び出しは Message too long と言って失敗します。バッファサイズとして 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 に答える