ping 程序(vc6.0 原始套接字实现)
2012-06-26 10:59
501 查看
#include <stdio.h> #include <WINSOCK2.H> #include <windows.h> #include <ws2tcpip.h> //IP_TTL #pragma comment(lib,"ws2_32.lib") //ICMP首部结构体 typedef struct tagICMPHEADER { unsigned char type;//类型 unsigned char code;//代码 unsigned short checknum;//检验和 unsigned short id;//标识符 unsigned short seq_num;//序列号 }ICMPHEADER; //IP首部结构体 typedef struct _ip_hdr { unsigned char ihl:4; //首部长度 unsigned char version:4, //版本 unsigned char tos; //服务类型 unsigned short tot_len; //总长度 unsigned short id; //标志 unsigned short frag_off; //分片偏移 unsigned char ttl; //生存时间 unsigned char protocol; //协议 unsigned short chk_sum; //检验和 struct in_addr srcaddr; //源IP地址 struct in_addr dstaddr; //目的IP地址 }IPHEADER; //计算检验和 unsigned short checksum(unsigned short *buffer, int size) { unsigned long cksum = 0; // 将所有的16数相加 while (size > 1) { cksum += *buffer++; size -= sizeof(unsigned short); } if (size) //加上最后一个BYTE { cksum += *(unsigned char*)buffer; } while (cksum>>16) { cksum = (cksum & 0xffff) + (cksum >> 16); } return (unsigned short)~cksum; } int main() { WSADATA wsadata; if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0) { printf("初始化socket dll失败\n"); return 1; } //设置ICMP首部内容 ICMPHEADER icmp_hdr; icmp_hdr.type=8; icmp_hdr.code=0; icmp_hdr.checknum=0; icmp_hdr.id=(unsigned short)GetCurrentProcessId(); icmp_hdr.seq_num=0; //计算检验和 icmp_hdr.checknum=checksum((unsigned short*)&icmp_hdr,sizeof(icmp_hdr)); //设置原始套接字 SOCKET sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,0); if(INVALID_SOCKET==sock) { printf("创建socket失败\n"); WSACleanup(); return 1; } int ttl=255; //设置TTL为255 if(setsockopt(sock,IPPROTO_IP,IP_TTL,(const char*)&ttl,sizeof(ttl))==SOCKET_ERROR) { printf("set TTL error!\n"); WSACleanup(); return 2; } //目标地址 SOCKADDR_IN Dest_addr; memset(&Dest_addr,0,sizeof(Dest_addr)); Dest_addr.sin_family=AF_INET; Dest_addr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1"); //发送ICMP请求报文 int status=sendto(sock,(const char*)&icmp_hdr,sizeof(icmp_hdr),0,(SOCKADDR*)&Dest_addr,sizeof(Dest_addr)); if(SOCKET_ERROR==status) { printf("sent error!\n"); shutdown(sock,SD_BOTH); closesocket(sock); WSACleanup(); return 3; } int size=60+sizeof(ICMPHEADER); char *buffer=(char*)malloc(size); memset(buffer,0,size); int des=sizeof(SOCKADDR_IN); //接受ICMP回应报文并分析 while (true) { recvfrom(sock,buffer,size,0,(SOCKADDR*)&Dest_addr,&des); ICMPHEADER *p=(ICMPHEADER*)((char*)buffer+((IPHEADER*)buffer)->ihl*4); if(p->type==0) { if(p->id==icmp_hdr.id) { printf("ping %s成功\n",inet_ntoa(Dest_addr.sin_addr)); break; } } else { printf("ping %s不成功\n",inet_ntoa(Dest_addr.sin_addr)); break; } } shutdown(sock,SD_BOTH); closesocket(sock); WSACleanup(); return 0; }
相关文章推荐
- 基于C语言与原始套接字实现Ping程序
- 《网络编程》原始套接字 ---ping程序实现
- 使用原始套接字编程实现简单的ping程序
- 002.ICMP--拼接ICMP包,实现简单Ping程序(原始套接字)
- Linux网络编程之原始套接字-ping协议实现
- Linux 原始套接字 ping的实现 (转)
- ping的实现(原始套接字系列三)
- 黑客之旅――原始套接字(Raw Socket)透析(3)--用Raw Socket实现Ping
- Linux原始套接字----ping命令的实现
- 黑客之旅――原始套接字(Raw Socket)透析(3)--用Raw Socket实现Ping
- 原始套接字的使用之编程实现DoS(拒绝服务)攻击程序
- 使用原始套接字实现时间戳程序
- Windows下利用原始套接字实现的一个抓包程序Demo
- 原始套接字透析之实现Ping
- 原始套接字透析之实现Ping(转)
- Linux下使用原始套接字实现ping 功能
- 原始套接字--简易ping程序
- 原始套接字透析之实现Ping
- 用原始套接字编程实现linux中的 ping 命令 ************************
- 用原始套接字编程实现linux中的 ping 命令