setsockopt不起作用的解决方案
帮助一位同学解决手动实现traceroute遇到了Windows socket使用setsockopt设置TTL无效的问题,原因很离奇,在这里记录一下。
# 起因
同学需要手动实现traceroute,即自己组ICMP数据包,发送出去,手动解析接受到的数据。
# 问题
每次都只能拿到一个回复,然后直接结束,wireshark抓包发现无论ttl设置为多少,实际发送的ttl都为0x80,这就解释了为什么只收到了一个回复,因为已经到目标地址了。
# 解决过程
设置ttl使用如下代码:
result = setsockopt(sock, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(int));
1
无论ttl是多少,使用getsockopt获取到的ttl都是1,且实际发送的为0x80,且全称没有任何函数返回值非0。(即没有函数报错)。该代码使用Dev C++编写,编译器为TDM-GCC 4.9.2
。将代码复制到Visual Studio编译,运行成功,符合预期,怀疑是编译器问题,进一步找到是链接器选项问题。
# 解决方案
将Dev c++链接器参数从-lwsock32
改为-lws2_32
,即可成功解决。
编辑 (opens new window)
上次更新: 2024/11/17, 13:04:13
- 02
- containerd高版本换源,containerd换源无效问题11-07
- 03
- apt-get使用代理11-05