我编写了一个在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)
| 归档时间: |
|
| 查看次数: |
5428 次 |
| 最近记录: |