我在 OS X 上编写了一个 traceroute 程序。我正在尝试将它移植到 GNU/Linux。
[@osx]
>> sudo bin/traceroute www.google.com
Warning: www.google.com has multiple addresses; using 173.194.69.99
...
为了让它在 GNU/Linux 上编译,我添加了_GNU_SOURCE
特性测试宏。
[@ubuntu]
>> sudo bin/traceroute www.google.com
error setting socket options: Invalid argument
问题在:
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 }
看起来setsockopt(...)
无法识别IP_TTL
为套接字选项。
但是,我将IP_TTL
其视为IPPROTO_IP
级别的套接字选项。
我SOCK_DGRAM
用作我的发送套接字以避免准备我自己的ICMP
数据包。