关于windows网络编程中模拟ping操作中IP数据包和ICMP数据包问题???

gd6321374 2016-05-05 08:34:33

这两天windows网络编程时,看到有一个小实验时,模拟ping这个命令,检测主机在线的状态?
我知道数据传输过程中,ICMP数据包是包含在IP中的,
然后程序调用sendto()函数直接发送ICMP包,此时y
而使用recvfrom()接收数据时,在缓冲区中,有IP包的数据,即需要处理IP数据包,从数据中提取ICMP数据包。

现在问题是,为什么在使用sendto()发送数据时,不用事先加上IP数据包,而使用recvfrom()接收数据时,却需要处理IP数据包。
我i的理解是,sendto()发送数据后是直接在数据包发送前,会加上IP包,即函数内部会加上。
而recvfrom()是在函数内部不处理IP包的。
请问大侠,这个该如何解释呢????请指教,先谢谢了。

==========================================================================
//初始化ICMP首部
181. ((IcmpHeader*)icmp_data)->icmp_cksum = 0; //校验和置零
182. ((IcmpHeader*)icmp_data)->icmp_data = GetTickCount();
183.
184. ((IcmpHeader*)icmp_data)->icmp_seq = seq_no++; //序列号++
185. ((IcmpHeader*)icmp_data)->icmp_cksum = checksum((USHORT*)icmp_data,datasize); //计算校验和
186.
187. bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); //发送数据

============================================================================
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); //接受在线主机返回数据
200. if (bread == SOCKET_ERROR){
201. if (WSAGetLastError() == WSAETIMEDOUT) {
202. printf("Request timed out.\n");
203. continue; }
207. } vb
208. if(!decode_resp(recvbuf,bread,&from)) //数据解析,这里是将接受到的数据处理,里面就需要处理IP包,为什么????????????????????????????????????


...全文
328 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2016-05-08
  • 打赏
  • 举报
回复
看《tcp/ip详解》
gd6321374 2016-05-08
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
socket有三种类型:流、数据报、原始套接字; 流和数据报会自动添加tcp(upd)和ip头,而原始套接字类型的socket不会加
谢谢,我知道这个问题的所在了, 看到一份资料是这样解释的: 接收报文 网络层原始套接字接收到的报文数据是从IP首部开始的,即接收到的数据包含了IP首部, TCP/UDP/ICMP等首部, 以及数据部分。 发送报文 网络层原始套接字发送的报文数据,在默认情况下是从IP首部之后开始的,即需要由调用者自行构造和封装TCP/UDP等协议首部。 发送报文,这种套接字也提供了发送时从IP首部开始构造数据的功能,通过setsockopt()给套接字设置上IP_HDRINCL选项,就需要在发送时自行构造IP首部。 谢谢啊
ztenv 版主 2016-05-05
  • 打赏
  • 举报
回复
socket有三种类型:流、数据报、原始套接字; 流和数据报会自动添加tcp(upd)和ip头,而原始套接字类型的socket不会加

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧