PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • 多智能体控制

  • 网络

    • setsockopt不起作用的解决方案
      • 起因
      • 问题
      • 解决过程
      • 解决方案
    • C++实现发送SYN的端口扫描
  • 数据库

  • 云计算

  • 课程
  • 网络
PeaceSheep
2022-04-23
目录

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)
#网络
上次更新: 2025/04/15, 10:52:45
AIRSIM安装与Demo运行
C++实现发送SYN的端口扫描

← AIRSIM安装与Demo运行 C++实现发送SYN的端口扫描→

最近更新
01
ubuntu安装g++显示已有但是输入g++又找不到命令
04-15
02
使用cloudflare-r2搭建webdav
04-08
03
LLM聚合平台客户端对比
03-29
更多文章>
Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
冀ICP备2022004632号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式