一般用套接字做的程序都包含客户端和服务端,这样一方发送的数据包,会有对应的端口进行接收和反馈,但在PING的实现中,只是程序发送构造的数据包,谁能帮我解释一下对方操作系统是如何响应这些数据包的?
谢谢!
或者相关这方面的知识也可以!

解决方案 »

  1.   

    ping 是基于ICMP 协议的应用,ICMP(Internet Control Message Protocol)是IP协议的附属协议
    主要功能就是用于路由器或者主机向其他的路由器或者主机发送出错报文和控制信息,所以ping远程主机或路由器是由对方的ICMP协议自动回复响应的,不需要客户端
      

  2.   

    http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=309
    这里有个例子,看看对你是不是有所帮助
      

  3.   

    那个程序,没有工作空间的,有cpp, h还有ocx你在程序中加入这个类还有ocx就可以了
      

  4.   

    一直不明白为什么要加入一段程序进行计算校验和
    //计算校验和 
    memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
    memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 
    tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
    memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
    memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4); 
    ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),0, (struct sockaddr*)&addr_in,sizeof(addr_in)); 后面不是就发送了ipHeader吗,前面搞计算检验有什么实际意义吗?防止错误?
      

  5.   

    看一下ICMP的包结构你就明白了~~~~~
      

  6.   

    大哥能不能帮我解释一下,其实最近一段时间一直在看ICMP的资料,但比较头大!
    能不能结合一个源代码,用原始套接字自定义IP头,如何进行设置并包入ICMP包,后校验,(但我总觉得校验后怎么把校验数据真入数据我)进行传输!
      

  7.   

    //填充IP首部 
      ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); //高四位IP版本号,低四位首部长度 
      ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度(字节) 
      ip_header.ident=1;//16位标识 
      ip_header.frag_and_flags=0; //3位标志位 
      ip_header.ttl=128;//8位生存时间 TTL 
      ip_header.proto=IPPROTO_ICMP; //8位协议 (TCP, UDP 或其他) 
      ip_header.checksum=0;//16位IP首部校验和 
      ip_header.sourceIP=inet_addr(FakeSourceIp); //32位源IP地址 *此处可即更改源IP地址 
      ip_header.destIP=inet_addr(DestIp);//32位目的IP地址 
    //填充ICMP首部 
      icmp_header.i_type = 8; //8位类型
      icmp_header.i_code = 0; //8位代码
      icmp_header.i_cksum = 0; //16位校验和
      icmp_header.i_id = 2; //识别号(一般用进程号作为识别号)
      icmp_header.timestamp = 999;//时间戳 
      icmp_header.i_seq=999; //报文序列号
    //
    //后面开始就有点郁闷 !给点注释!
      memcpy(SendBuf, &icmp_header, sizeof(icmp_header)); 
      memset(SendBuf+sizeof(icmp_header), 'E', PacketSize); 
      icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+PacketSize); 
      memcpy(SendBuf,&ip_header,sizeof(ip_header)); 
      memcpy(SendBuf+sizeof(ip_header), &icmp_header, sizeof(icmp_header)); 
      memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header), 'E', PacketSize); 
      memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header)+PacketSize, 0, 1);