【发布时间】:2014-10-31 05:28:01
【问题描述】:
我正在编写发送 icmp 回显请求的简单程序。我正在使用 ping 套接字(无需 suid 即可发送)。
这就是我打开套接字的方式:
int fd=socket(PF_INET,SOCK_DGRAM,IPPROTO_ICMP);
这就是我构造 icmp 数据报的方式:
struct icmphdr req;
req.type=8;
req.code=0;
req.checksum=0;
req.un.echo.id=htons(12);
req.un.echo.sequence=htons(1);
我正在使用 sendto() 发送数据包,它运行良好,我的意思是目标主机接收请求,发送响应,并且我能够在我的程序中接收此响应。
但是,我不确定 un.echo.id 字段的含义。在网上的许多示例中,该字段填充了诸如 rand() 之类的内容。但是稍后会被覆盖,我可以在 tcpdump 中清楚地看到它。
我找到了这样的描述: LWN.net net: ipv4: add IPPROTO_ICMP
消息标识符(ICMP 标头的八位字节 4-5)被解释为本地 港口。地址存储在 struct sockaddr_in 中。没有端口号 为特权进程保留,端口 0 为 API 保留(“让 内核选择一个空闲号码”)。没有远程端口的概念,远程 用户提供的端口号(例如在 connect() 中)被忽略。
我不清楚。 那么请告诉我,我是否应该填写这个文件?
更新: 感谢 John 的 Zwinck anwer,我意识到我发布了错误的代码示例,现在它是正确的。
这里是整个代码和 tcpdump 输出:code and dump
它说明了我的问题,在代码中 id 设置为 12(只是一个随机数,尝试了很多其他的)但是转储中的 icmp 标头的 id 设置为 4。
【问题讨论】: