setsockopt(...)无法在Ubuntu上识别IPPROTO_IP的IP_TTL

Vai*_*pai 2 c sockets

我编写了一个在OS X上编写的traceroute程序.我试图将它移植到GNU/Linux.

[@osx]
>> sudo bin/traceroute www.google.com

Warning: www.google.com has multiple addresses; using 173.194.69.99
...
Run Code Online (Sandbox Code Playgroud)

为了使它在GNU/Linux上编译,我添加了_GNU_SOURCE功能测试宏.

[@ubuntu]
>> sudo bin/traceroute www.google.com

error setting socket options: Invalid argument
Run Code Online (Sandbox Code Playgroud)

问题出在:

 85     send_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 86     if(send_socket == -1){
 87        fprintf(stderr, "\ncannot create send socket");
 88        freeaddrinfo(dest_addrinfo_collection);
 89        return EXIT_FAILURE;
 90      }
 91     error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(int));
 92     if(error != 0){
 93        perror("\nerror setting socket options");
 94        freeaddrinfo(dest_addrinfo_collection);
 95        return EXIT_FAILURE;
 96      }
Run Code Online (Sandbox Code Playgroud)

看起来setsockopt(...)无法识别IP_TTL为套接字选项.
但是我将其IP_TTL视为IPPROTO_IP级别的套接字选项.

我正在使用SOCK_DGRAM我的发送套接字来避免准备我自己的ICMP数据包.

小智 6

这就是你应该使用sizeof(变量)代替sizeof(type)的原因,因为如果类型发生变化,你就会再次被搞砸.这是强烈建议和推荐,不仅在这种情况下,而且当你使用malloc()等时.

error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
Run Code Online (Sandbox Code Playgroud)