谁能帮我解释一下扫描编程的问题?(关于SockRaw) 一般用套接字做的程序都包含客户端和服务端,这样一方发送的数据包,会有对应的端口进行接收和反馈,但在PING的实现中,只是程序发送构造的数据包,谁能帮我解释一下对方操作系统是如何响应这些数据包的?谢谢!或者相关这方面的知识也可以! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ping 是基于ICMP 协议的应用,ICMP(Internet Control Message Protocol)是IP协议的附属协议主要功能就是用于路由器或者主机向其他的路由器或者主机发送出错报文和控制信息,所以ping远程主机或路由器是由对方的ICMP协议自动回复响应的,不需要客户端 http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=309这里有个例子,看看对你是不是有所帮助 那个程序,没有工作空间的,有cpp, h还有ocx你在程序中加入这个类还有ocx就可以了 一直不明白为什么要加入一段程序进行计算校验和//计算校验和 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吗,前面搞计算检验有什么实际意义吗?防止错误? 看一下ICMP的包结构你就明白了~~~~~ 大哥能不能帮我解释一下,其实最近一段时间一直在看ICMP的资料,但比较头大!能不能结合一个源代码,用原始套接字自定义IP头,如何进行设置并包入ICMP包,后校验,(但我总觉得校验后怎么把校验数据真入数据我)进行传输! //填充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); VS 2008中MSDN使用问题 网页中的excel插件(WOC activex)如何加载本地的excel文件 两段程序的差别 怎样动态调整button控件的大小 如何得到子窗口中获得焦点的控件的性质,如是button还是edit等? 请高手指教 请问,在VAssistX助手里,这个自动缩进的细节是否能调或者设置?在哪个位置设? 如何做COM event的 sink? 没人对UNICODE感兴趣的嘛??????????????????? 文件的拷贝追加问题 为什么我的api函数运行了4次就停了? 求教关于一个CRect类型转换的问题
主要功能就是用于路由器或者主机向其他的路由器或者主机发送出错报文和控制信息,所以ping远程主机或路由器是由对方的ICMP协议自动回复响应的,不需要客户端
这里有个例子,看看对你是不是有所帮助
//计算校验和
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吗,前面搞计算检验有什么实际意义吗?防止错误?
能不能结合一个源代码,用原始套接字自定义IP头,如何进行设置并包入ICMP包,后校验,(但我总觉得校验后怎么把校验数据真入数据我)进行传输!
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);