鱼C论坛

 找回密码
 立即注册
查看: 2487|回复: 6

[技术交流] SDK写的模仿Ping程序

[复制链接]
发表于 2015-7-7 10:04:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 迷雾少年 于 2015-7-7 10:05 编辑

代码很简单  做得不是很好 还请各位不喷
23.png
输入ping ip 就可以了
还是老规矩 回复见代码  -> 另外请各位多多支持

完整代码送上  
  1. [hide]#include <stdio.h>
  2. #include <WinSock2.h>
  3. #include <Windows.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. #define IP_HDRINCL      2 /* header is included with data */



  6. /* IP头结构 */
  7. typedef struct IP_HEADER {
  8.         unsigned char h_lenver; //4位首部长度+4位IP版本号
  9.         unsigned char tos; //8位服务类型TOS
  10.         unsigned short total_len; //16位总长度(字节)
  11.         unsigned short ident; //16位标识
  12.         unsigned short frag_and_flags; //3位标志位
  13.         unsigned char ttl; //8位生存时间 TTL
  14.         unsigned char proto; //8位协议 (TCP, UDP 或其他)
  15.         unsigned short checksum; //16位IP首部校验和
  16.         unsigned int sourceIP; //32位源IP地址
  17.         unsigned int destIP; //32位目的IP地址
  18. }IP_HEADER;

  19. /*Ping*/
  20. typedef struct _ping
  21. {
  22.     UCHAR i_type;//8位类型
  23.     UCHAR i_code;//8位代码
  24.     USHORT i_chksum;//16位ICMP校验和
  25.     USHORT i_identify;//16位标志位
  26.     USHORT i_seqnum;//16位序号
  27.     ULONG    i_timestamp;//32位时间戳
  28.     UCHAR i_data[32];//32BYTE选项数据
  29. }PingHeader,*pPingHeader;










  30. /* 校验和 */
  31. USHORT checksum(USHORT *buffer, int size);


  32. /* 创建一个ICMP原始套接字 */
  33. SOCKET CreateICMPRawSocket()
  34. {

  35.         return socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);  //INVALID_SOCKET  
  36. }
  37. /* 关闭套接字 */
  38. int    CloseRawSocket(SOCKET Socket)
  39. {
  40.         return closesocket(Socket);  //如无错误发生,则closesocket()返回0
  41. }
  42. int    InilatSocket()
  43. {
  44.         WSADATA Wsadata = {0};
  45.         WSAStartup(MAKEWORD(2,2),&Wsadata);  //成功返回0
  46. }
  47. int    CleadSocket()
  48. {
  49.         return WSACleanup();
  50. }
  51. /*
  52. VOID   FullIpHeader(IP_HEADER *IP,char * SourceIp,char *DesIp)
  53. {
  54.         IP->destIP = inet_addr(DesIp);
  55.         IP->sourceIP = inet_addr(SourceIp);
  56.         IP->proto = IPPROTO_ICMP;
  57.         IP->h_lenver=(4<<4 | sizeof(IP_HEADER)/sizeof(unsigned long)); //高四位IP版本号,低四位首部长度
  58.         //IP->total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)


  59. }*/
  60. VOID FullIcmp(PingHeader *Ping,unsigned int i)
  61. {
  62.             unsigned int j = 0;
  63.             
  64.             Ping->i_type = 8;
  65.             Ping->i_code = 0;
  66.         Ping->i_seqnum =    (USHORT)i;
  67.         Ping->i_identify =  (unsigned short)GetCurrentProcessId();
  68.         Ping->i_timestamp = (unsigned long) GetTickCount();
  69.                 for(j=0;j < 32; j++)
  70.             Ping->i_data[j] =  (UCHAR)('a'+j);


  71.             Ping->i_chksum = 0;
  72.         //计算校验和
  73.         Ping->i_chksum = checksum((unsigned short*)Ping,sizeof(PingHeader));

  74.        



  75. }
  76. int   PingIp(char *IpAddress)
  77. {

  78.         char on = 4000;

  79.         int nCount = 0;

  80.         int RecvLen = 0;

  81.         char RecvBuff[1024] = {0};

  82.         SOCKET RawSocket=0;

  83.         IP_HEADER IPHEADER = {0};

  84.         PingHeader ICMP = {0};

  85.         SOCKADDR_IN AddrssSocket = {0};
  86.         for ( nCount = 1; nCount < 5; nCount++)
  87.         {
  88.         InilatSocket();

  89.         RawSocket = CreateICMPRawSocket();
  90.         if(INVALID_SOCKET==RawSocket)  //失败
  91.         {
  92.                 printf("创建原始套接字失败\n");
  93.                 return -1;
  94.         }
  95.         //设置IP_HDRINCL 选项 我们自己构建IP包
  96.         if ( setsockopt(RawSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&on,sizeof(int)) < 0 )  //失败
  97.         {
  98.                 printf("设置IP_HDRINCL失败 错误码%d\n",GetLastError());
  99.                 return -1;
  100.         }

  101.         /* 填充地址 */
  102.         AddrssSocket.sin_addr.S_un.S_addr = inet_addr(IpAddress);
  103.         AddrssSocket.sin_family = AF_INET;
  104.        

  105.         FullIcmp(&ICMP,nCount);
  106.        
  107.         if(sendto(RawSocket, (char*)&ICMP, sizeof(ICMP),0, (struct sockaddr*)&AddrssSocket, sizeof(AddrssSocket)) == SOCKET_ERROR)
  108.         {
  109.             printf("\nSend ping packet error: %d \n",WSAGetLastError());
  110.             return -1;
  111.         }
  112.         memset(RecvBuff, 0, 1024);
  113.         RecvLen = sizeof(AddrssSocket);
  114.         if(SOCKET_ERROR == recvfrom(RawSocket,RecvBuff,sizeof(RecvBuff),0,(struct sockaddr*)&AddrssSocket, &RecvLen))
  115.         {
  116.                 int err = WSAGetLastError();
  117.                     if(err != 10060)//超时错误不返回
  118.             {
  119.                 printf("recv data error: %d ",err);
  120.                                 goto End;
  121.                 return -1;
  122.             }
  123.             else if(err == 0x274c)
  124.                 fprintf(stdout, "请求超时.\n ");
  125.                         goto End;

  126.                

  127.         }
  128.         memcpy(&IPHEADER,RecvBuff,sizeof(IPHEADER));
  129.         memcpy(&ICMP,RecvBuff+sizeof(IPHEADER),sizeof(PingHeader));
  130.         AddrssSocket.sin_family = AF_INET;
  131.         AddrssSocket.sin_addr.S_un.S_addr = IPHEADER.sourceIP;



  132.         if(ICMP.i_type==3)
  133.         {
  134.         switch (ICMP.i_code)
  135.         {
  136.         case 0:
  137.                 {
  138.                         printf("网络不可达!\n");
  139.                         break;
  140.                 }
  141.         case 1:
  142.                 {
  143.                         printf("主机不可达!\n");
  144.                         break;
  145.                 }
  146.         case 2:
  147.                 {
  148.                         printf("协议不可达!\n");
  149.                         break;
  150.             }
  151.         case 3:
  152.                 {
  153.                         printf("端口不可达!\n");
  154.                         break;
  155.                 }
  156.          default:
  157.                  {
  158.             
  159.                          break;
  160.                  }

  161.         }
  162.        
  163.         }
  164.         else  printf("Seq:%d From:%s  TTL:%d   Time:%d(ms)  Data:%d(Byte)\n",ICMP.i_seqnum,inet_ntoa(AddrssSocket.sin_addr),IPHEADER.ttl,GetTickCount()-ICMP.i_timestamp,strlen(( const char *)ICMP.i_data)-10);

  165.                
  166. End:        CloseRawSocket(RawSocket);
  167.             CleadSocket();

  168.        

  169.         Sleep(1000);

  170.         }

  171.         /* 接收的是IP结构 + ICMP结构 */
  172.         //memcpy(&IPHEADER,RecvBuff,sizeof(IPHEADER));
  173.         //memcpy(&ICMP,RecvBuff+sizeof(IPHEADER),sizeof(PingHeader));





  174. }



  175. unsigned char GetPoint(char *szString)
  176. {

  177. }
  178. int main(void)
  179. {
  180.         char IpAddress[20] = {0};
  181.         system("title MPing By:MiWu");
  182.         system("color 2");
  183.         while(1)
  184.         {
  185.         printf("ByExE>>");
  186.         memset(IpAddress,0,20);      
  187.         scanf("ping %s",IpAddress); //接收输入IP地址
  188.        



  189.         fflush(stdin);              //fflsuh清除输入缓冲区  不然下次scanf不会等待输入的
  190.        

  191.        
  192.         PingIp(IpAddress);          //Ping 默认4次

  193.         }

  194.         return 0;
  195. }


  196. //计算检验和
  197. USHORT checksum(USHORT *buffer, int size)
  198. {
  199.         unsigned long cksum=0;
  200.         unsigned short answer=0;
  201.         while (size > 1) {
  202.                 cksum += *buffer++;
  203.                 size -= sizeof(USHORT);
  204.         }
  205.         if (size==1) {
  206.                 *(char *)&answer=*(char *)buffer;
  207.                 cksum += answer;
  208.         }
  209.         while(cksum >> 16)
  210.                 cksum = (cksum >> 16) + (cksum & 0xffff);
  211.         return (USHORT)(~cksum);
  212. } [/hide]
复制代码



附件 : Main.rar (2.46 KB, 下载次数: 16)

评分

参与人数 3荣誉 +18 鱼币 +18 贡献 +14 收起 理由
拈花小仙 + 5 + 5 + 4 和网上的不同,支持迷雾原创~
freeparty + 8 + 8 + 5 热爱鱼C^_^
小人 + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-7-7 10:07:16 | 显示全部楼层
域名转换没加上  各位自己加吧  gethostbyname
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-7 11:38:02 | 显示全部楼层
谢谢楼主分享    这真是极好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-7 16:27:40 | 显示全部楼层
学习学习,谢谢分享哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-7 19:43:08 | 显示全部楼层
http://bbs.fishc.com/thread-62762-1-1.html  高手 过来帮个忙!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-7 22:47:56 | 显示全部楼层
858418616 发表于 2015-7-7 19:43
http://bbs.fishc.com/thread-62762-1-1.html  高手 过来帮个忙!

已解决 送上 完整软件 + 源码 了{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-8 08:38:47 | 显示全部楼层
厉害啊 O(∩_∩)O~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 02:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表