这两天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包,为什么????????????????????????????????????