gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:38:28 24 4
gpt4 key购买 nike

我编写了一个在 OS X 上编写的跟踪路由程序。我正在尝试将其移植到 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 数据包。

最佳答案

这就是为什么你应该使用 sizeof(variable) 代替 sizeof(type),因为如果类型发生变化,你就会再次陷入困境。不仅在这种情况下,而且在使用 malloc() 等时,都强烈建议和推荐这样做。

error = setsockopt(send_socket, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));

关于c - 在 Ubuntu 上,setsockopt(...) 无法识别 IPPROTO_IP 的 IP_TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com