工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1579|回复: 3

[HACK]显上一段精美的源代码.

[复制链接]
发表于 2004-3-20 22:22 | 显示全部楼层 |阅读模式
本人刚注册.以下一段PING代码



// Ping.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#define ICMP_ECHOREPLY0
#define ICMP_ECHOREQ8
#define REQ_DATASIZE 32// Echo 请求数据的大小

class CPing
{
   public:
   void Ping(UINT nRetries,LPCSTR pstrHost);
   int  WaitForEchoReply(SOCKET s);
   //ICMP回应的请求和回答函数
   intSendEchoRequest(SOCKET, LPSOCKADDR_IN);
   DWORDRecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *);
   u_short in_cksum(u_short *addr, int len);

   protected:


};



// IP Header -- RFC 791
typedef struct tagIPHDR
{
   u_char  VIHL;// Version and IHL
   u_charTOS;// Type Of Service
   shortTotLen;// Total Length
   shortID;// Identification
   shortFlagOff;// Flags and Fragment Offset
   u_charTTL;// Time To Live
   u_charProtocol;// Protocol
   u_shortChecksum;// Checksum
   structin_addr iaSrc;// Internet Address - Source
   structin_addr iaDst;// Internet Address - Destination
}IPHDR, *PIPHDR;


// ICMP Header - RFC 792
typedef struct tagICMPHDR
{
   u_charType;// Type
   u_charCode;// Code
   u_shortChecksum;// Checksum
   u_shortID;// Identification
   u_shortSeq;// Sequence
   charData;// Data
}ICMPHDR, *PICMPHDR;



// ICMP Echo Request
typedef struct tagECHOREQUEST
{
   ICMPHDR icmpHdr;
   DWORDdwTime;
   charcData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;


// ICMP Echo Reply
typedef struct tagECHOREPLY
{
   IPHDRipHdr;
   ECHOREQUESTechoRequest;
   char    cFiller[256];
}ECHOREPLY, *PECHOREPLY;

void CPing::Ping(UINT nRetries,LPCSTR pstrHost)
{
   SOCKET  rawSocket;
   LPHOSTENT lpHost;
   UINT  nLoop;
   int       nRet;
   struct    sockaddr_in saDest;
   struct    sockaddr_in saSrc;
   DWORD  dwTimeSent;
   DWORD  dwElapsed;
   u_char    cTTL;




   //创建一个Raw套节字
   rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
   if (rawSocket == SOCKET_ERROR)
   {

      MessageBox(NULL,"","socket()",0);
      return;
   }

   //获得主机信息
   lpHost = gethostbyname(pstrHost);
   if (lpHost == NULL)
   {
      printf("Host not found: %s\n", pstrHost);

      return;
   }

   //构造目标套节字地址信息
   saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
   saDest.sin_family = AF_INET;
   saDest.sin_port = 0;

   //告诉用户我们现在的工作
   printf("Pinging %s [%s] with %d bytes of data:\n",
   pstrHost,
   inet_ntoa(saDest.sin_addr),
   REQ_DATASIZE);

   //多次ping
   for (nLoop = 0; nLoop < nRetries; nLoop++)
   {
       //发送ICMP回应请求
       SendEchoRequest(rawSocket, &saDest);

       nRet = WaitForEchoReply(rawSocket);
       if (nRet == SOCKET_ERROR)
       {
          MessageBox(NULL,"","select()",0);

          break;
       }
       if (!nRet)
       {
           printf("Request Timed Out\n");
       }
       else

       {
           //获得回应
           dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);

           //计算时间
           dwElapsed = GetTickCount() - dwTimeSent;
           printf("Reply[%d] from: %s: bytes=%d time=%ldms TTL=%d\n",
           nLoop+1,
           inet_ntoa(saSrc.sin_addr),
           REQ_DATASIZE,
           dwElapsed,
           cTTL);


          Sleep(1000);
      }
   }


   nRet = closesocket(rawSocket);
   if (nRet == SOCKET_ERROR)
   MessageBox(NULL,"","closesocket()",0);
}

//发送ICMPECHO数据包请求
int CPing::SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)
{
   static ECHOREQUEST echoReq;
   static nId = 1;
   static nSeq = 1;
   int nRet;

   //构造回应请求
   echoReq.icmpHdr.Type= ICMP_ECHOREQ;
   echoReq.icmpHdr.Code= 0;
   echoReq.icmpHdr.Checksum= 0;
   echoReq.icmpHdr.ID= nId++;
   echoReq.icmpHdr.Seq= nSeq++;

   for (nRet = 0; nRet < REQ_DATASIZE; nRet++)
   echoReq.cData[nRet] = ' '+nRet;

   //保存发送时间
   echoReq.dwTime= GetTickCount();

   echoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq, sizeof(ECHOREQUEST));

   //发送请求
   nRet = sendto(s,
   (LPSTR)&echoReq,
   sizeof(ECHOREQUEST),
   0,
   (LPSOCKADDR)lpstToAddr,
   sizeof(SOCKADDR_IN));   

   if (nRet == SOCKET_ERROR)
     MessageBox(NULL,"","sendto()",0);
   return (nRet);
}

//接收ICMPECHO数据包回应
DWORD CPing::RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL)
{
   ECHOREPLY echoReply;
   int nRet;
   int nAddrLen = sizeof(struct sockaddr_in);

   //接收请求回应
   nRet = recvfrom(s,
   (LPSTR)&echoReply,
   sizeof(ECHOREPLY),
   0,
   (LPSOCKADDR)lpsaFrom,
   &nAddrLen);

   //检查返回值
   if (nRet == SOCKET_ERROR)
      MessageBox(NULL,"","recvfrom()",0);
   //返回发送的时间
   *pTTL = echoReply.ipHdr.TTL;

   return(echoReply.echoRequest.dwTime);   
}

//等待回应
int CPing::WaitForEchoReply(SOCKET s)
{
   struct timeval Timeout;
   fd_set readfds;

   readfds.fd_count = 1;
   readfds.fd_array[0] = s;
   Timeout.tv_sec = 1;
   Timeout.tv_usec = 0;

   return(select(1, &readfds, NULL, NULL, &Timeout));
}


//转换地址
u_short CPing::in_cksum(u_short *addr, int len)
{
   register int nleft = len;
   register u_short *w = addr;
   register u_short answer;
   register int sum = 0;

   while( nleft > 1 )  
   {
      sum += *w++;
      nleft -= 2;
   }

   if( nleft == 1 )
   {
      u_shortu = 0;

      *(u_char *)(&u) = *(u_char *)w ;
      sum += u;
    }

    sum = (sum >> 16) + (sum & 0xffff);
    sum += (sum >> 16);
    answer = ~sum;
    return (answer);
}




//==================================================================================================//
/*==================================================================================================*/
int main(int argc, char* argv[])
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1),&wsaData);
    class CPing d;
    d.Ping(5,"www.163.com");//第一个参数表示ping几次,第2个是对方的ip地址

    return 0;
}
发表于 2004-3-21 01:57 | 显示全部楼层
虽然看不懂,但一定是好东西
回复

使用道具 举报

发表于 2004-3-21 12:27 | 显示全部楼层
能告诉我好在哪里吗...
基本的ICMP包的构造和发送过程都差不多的...-_ -||
回复

使用道具 举报

发表于 2004-3-21 15:47 | 显示全部楼层
有没有JSP的代码??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-16 10:04

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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