首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用icmp套接字时,是否应该将id写入icmphdr id字段?

使用icmp套接字时,是否应该将id写入icmphdr id字段?
EN

Stack Overflow用户
提问于 2014-09-06 11:30:46
回答 2查看 1.2K关注 0票数 2

我正在编写发送icmp回送请求的简单程序。我正在使用ping套接字(可以在没有suid的情况下发送)。

我就是这样打开套接字的:

代码语言:javascript
运行
复制
int fd=socket(PF_INET,SOCK_DGRAM,IPPROTO_ICMP);

我就是这样构造icmp数据报的:

代码语言:javascript
运行
复制
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中清楚地看到它。

我找到了这样的描述:ICMP

消息标识符( ICMP报头的octets 4-5 )被解释为本地端口。地址存储在struct sockaddr_in中。没有为特权进程保留端口号,端口0是为API保留的(“让内核选择一个空闲号”)。没有远程端口的概念,用户提供的远程端口号(例如connect())被忽略。

我不太清楚。所以,请你告诉我,我是否应该填写这份文件?

更新:由于John的Zwinck anwer,我意识到我发布了错误的代码示例,现在它是正确的。

下面是完整的代码和tcpdump输出:代码和转储

它说明了我的问题,在代码id中,id被设置为12 (只是一个随机数,尝试了许多其他数字),但是转储中的icmp头将id设置为4。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-08 09:11:16

您应该绑定到要用作icmp id的端口。添加

代码语言:javascript
运行
复制
struct sockaddr_in sa;
sa.sin_family = PF_INET;
sa.sin_port = htons(12);
sa.sin_addr.s_addr = htonl(INADDR_ANY);

socket()之后

代码语言:javascript
运行
复制
if (bind(fd,  (struct sockaddr *) &sa, sizeof(sa)) < 0)
        return -1;

这将导致身份是你想要的。可以将req.un.echo.id字段设置为0。在id为12的地方运行示例:

ICMP回复,id=0xc00,sequence = 0x100

票数 1
EN

Stack Overflow用户

发布于 2014-09-06 11:40:27

id字段可用于区分发送消息的程序。因此,您可以使用类似PID或另一个唯一的实时数字标识符(甚至是一个随机数,只要它对于作为一个操作发送的所有消息都是相同的随机数)。

sequence字段应该是一个连续的、递增的数字,而不是像现在这样的随机数。

但最终似乎要由发件人来决定如何使用这些字段。您可能会在它们中放一些其他有意义的数据,如果您想要的话,可以将其回显给您。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25699779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档