setsockopt的奇怪错误,“协议不可用”

时间:2012-04-04 04:31:47

标签: c linux sockets

适用的代码如下,确切错误。

sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if ( setsockopt( sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on) ) < 0 )
{
    printf("%s\n", strerror(errno));
}
if ( setsockopt( sd, IPPROTO_IP, IP_DF, &on, sizeof(on) ) < 0 )
{
    printf("%s\n", strerror(errno));
    printf("DF\n");
}

错误:

root@PC:~# gcc main.c
main.c: In function ‘main’:
main.c:71: warning: format not a string literal and no format arguments
root@PC:~# ./a.out localhost
Protocol not available
DF

奇怪的是第二个setsockopt是错误的,而第一个不是。

2 个答案:

答案 0 :(得分:3)

IP_DF是数据包标志,而不是套接字选项。有效的套接字选项在ip(7)手册页中给出。

答案 1 :(得分:0)

来自ip(7)手册页;

   IP_NODEFRAG (since Linux 2.6.36)
          If enabled (argument is nonzero), the reassembly of outgoing packets is
          disabled in the netfilter layer.  This option is only valid for
          SOCK_RAW sockets.  The argument is an integer.