【TCP/IP】C語言實現Ping小程序

    Ping程序一般用來測試一臺主機是否可達,該程序發送一份ICMP回顯請求報文給主機,并等待返回ICMP回顯 應答。愛掏網 - it200.com

    一般來說,如果不能Ping到某主機,那么就不能Telnet或者FTP到那臺主機。愛掏網 - it200.com反過來,如果不能Telnet到某臺主機,那么通常可以用Ping程序來確定問題出在哪里。愛掏網 - it200.comPing程序還可以檢測出到這臺主機的往返時間,以表明該主機里我們有“多遠”。愛掏網 - it200.com大多數的TCP/IP實現都在內核中直接支持Ping服務器。愛掏網 - it200.com

    ?

    ICMP回顯請求和回顯應答報文如下所示

    ?/****************************************************************/
    /* ? ? ? ?類型(0或8)| ? ? ? ?代碼(0)| ? ? ? ? ? ?校驗和 ? ? ? ?|*/
    /****************************************************************/
    /* ? ? ? ? ? ? ? ?標識符 ? ? ? ? ? ?| ? ? ? ? ? ? ? ?序號 ? ? ? ?|*/
    /****************************************************************/
    /* ? ? ? ? ? ? ? ? ? ? ? ? ? ?選項數據 ? ? ? ? ? ? ? ? ? ? ? ? ? |*/
    /****************************************************************/


    定義ICMP報頭數據結構

    typedef struct _ICMP_HEADER{
    ? ? BYTE nType;
    ? ? BYTE nCode;
    ? ? USHORT nCheckSum;
    ? ? USHORT nId;
    ? ? USHORT nSequence;
    ? ? UINT nTimeStamp;
    }ICMP_HEADER,*PICMP_HEADER;


    下面使用Socket實現Ping小程序。愛掏網 - it200.com

    // PingSock.cpp : 定義控制臺應用程序的入口點。愛掏網 - it200.com
    //
    #include "stdafx.h"
    #include
    #pragma comment(lib,"ws2_32.lib")
    #include


    //定義默認緩沖區長度
    #define DEF_BUF_SIZE 1024
    #define IP_HEADER_SIZE 20
    #define ICMP_HEADER_SIZE (sizeof(ICMP_HEADER))
    #define ICMP_DATA_SIZE 32
    #define ICMP_PACK_SIZE (ICMP_HEADER_SIZE + ICMP_DATA_SIZE)


    typedef struct _ICMP_HEADER{
    ? ? BYTE nType;
    ? ? BYTE nCode;
    ? ? USHORT nCheckSum;
    ? ? USHORT nId;
    ? ? USHORT nSequence;
    ? ? UINT nTimeStamp;
    }ICMP_HEADER,*PICMP_HEADER;
    ?
    char szInfo[DEF_BUF_SIZE] = {0};


    USHORT GetCheckSum(LPBYTE lpBuf, DWORD dwSize);
    BOOL Ping(char* lpDestIp);


    int _tmain(int argc, _TCHAR* argv[])
    {
    ? ? char szDestIp[DEF_BUF_SIZE] = {0} ;
    ? ? while ( scanf ( "%s", szDestIp) )
    ? ? ? ? Ping ( szDestIp ) ;
    ? ? ?
    ? ? return 0;
    }


    USHORT GetCheckSum(LPBYTE lpBuf, DWORD dwSize)
    {
    ? ? DWORD dwCheckSum = 0;
    ? ? USHORT* lpWord = (USHORT*)lpBuf;


    ? ? while( dwSize > 1)
    ? ? {
    ? ? ? ? dwCheckSum += *lpWord++;
    ? ? ? ? dwSize -= 2;
    ? ? }


    ? ? if(1 == dwSize)
    ? ? ? ? dwCheckSum += *((USHORT*)lpBuf);


    ? ? dwCheckSum = ( dwCheckSum >> 16) + ( dwCheckSum & 0xffff);
    ? ? return (USHORT)(~dwCheckSum);
    }


    BOOL Ping(char* lpDestIp)
    {
    ? ? SOCKADDR_IN DestAddr;
    ? ? DestAddr.sin_family = AF_INET;
    ? ? DestAddr.sin_addr.S_un.S_addr = inet_addr(lpDestIp);
    ? ? DestAddr.sin_port = htons(0);


    ? ? //創建ICMP請求包
    ? ? char ICMPPack[ICMP_PACK_SIZE] = {0};
    ? ? PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack;
    ? ? pICMPHeader->nType = 8;
    ? ? pICMPHeader->nCode = 0;
    ? ? pICMPHeader->nId = (USHORT)::GetCurrentProcessId();
    ? ? pICMPHeader->nCheckSum = 0;
    ? ? pICMPHeader->nTimeStamp = 0;
    ? ? memset(&(ICMPPack[ICMP_HEADER_SIZE]),'E',ICMP_DATA_SIZE);


    ? ? //初始化WinSock
    ? ? WORD wVersionRequested = MAKEWORD(2,2);
    ? ? WSADATA wsaData;
    ? ? if(WSAStartup(wVersionRequested,&wsaData) != 0)
    ? ? {
    ? ? ? ? return FALSE;
    ? ? }


    ? ? //創建初始套接字
    ? ? SOCKET RawSock = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
    ? ? if(INVALID_SOCKET == RawSock)
    ? ? {
    ? ? ? ? printf("create raw socket error\n");
    ? ? ? ? return FALSE;
    ? ? }


    ? ? int nTime = 1000;
    ? ? int nRet = ::setsockopt( RawSock, SOL_SOCKET, SO_RCVTIMEO,(char*)(&nTime),sizeof(nTime));


    ? ? char szRecvBuf [ DEF_BUF_SIZE] ;
    ? ? SOCKADDR_IN ? ?SourSockAddr ;


    ? ? for(int i = 0; i ? ? {
    ? ? ? ? pICMPHeader->nCheckSum = 0;
    ? ? ? ? pICMPHeader->nTimeStamp = ::GetTickCount();
    ? ? ? ? pICMPHeader->nSequence = i;


    ? ? ? ? pICMPHeader->nCheckSum = GetCheckSum ( (LPBYTE)ICMPPack, ICMP_PACK_SIZE ) ;


    ? ? ? ? int nRet = ::sendto( RawSock, ICMPPack, ICMP_PACK_SIZE, 0, (SOCKADDR*)&DestAddr, sizeof(DestAddr));
    ? ? ? ? if ( nRet == SOCKET_ERROR )
    ? ? ? ? {
    ? ? ? ? ? ? printf ( "sendto error!\n" ) ;
    ? ? ? ? ? ? return FALSE ;
    ? ? ? ? }


    ? ? ? ? // 接收ICMP響應
    ? ? ? ? int nLen = sizeof(SourSockAddr) ;
    ? ? ? ? nRet = ::recvfrom ( RawSock, szRecvBuf, DEF_BUF_SIZE,0,(SOCKADDR*)&SourSockAddr, &nLen ) ;
    ? ? ? ? if ( nRet == SOCKET_ERROR )
    ? ? ? ? {
    ? ? ? ? ? ? if ( ::WSAGetLastError() == WSAETIMEDOUT )
    ? ? ? ? ? ? {
    ? ? ? ? ? ? ? ? printf ( "Request Timeout\n" ) ;
    ? ? ? ? ? ? ? ? continue ;
    ? ? ? ? ? ? }
    ? ? ? ? ? ? else
    ? ? ? ? ? ? {
    ? ? ? ? ? ? ? ? printf ( "recvfrom error!\n" ) ;
    ? ? ? ? ? ? ? ? return FALSE ;
    ? ? ? ? ? ? }
    ? ? ? ? }


    ? ? ? ? int nTime = ::GetTickCount() - pICMPHeader->nTimeStamp ;


    ? ? ? ? int nRealSize = nRet - IP_HEADER_SIZE - ICMP_HEADER_SIZE ;
    ? ? ? ? if ( nRealSize ? ? ? ? {
    ? ? ? ? ? ? printf ( "To less recv bytes!\n" ) ;
    ? ? ? ? ? ? continue ;
    ? ? ? ? }


    ? ? ? ? // 檢測是否當前所發出的ICMP響應包
    ? ? ? ? PICMP_HEADER pRecvHeader = (PICMP_HEADER)(szRecvBuf+IP_HEADER_SIZE) ;
    ? ? ? ? if ( pRecvHeader->nType != 0 )
    ? ? ? ? {
    ? ? ? ? ? ? printf ( "Not ICMP respond type!\n" ) ;
    ? ? ? ? ? ? return FALSE ;
    ? ? ? ? }


    ? ? ? ? if ( pRecvHeader->nId != ::GetCurrentProcessId () )
    ? ? ? ? {
    ? ? ? ? ? ? printf ( "not valid id!\n" ) ;
    ? ? ? ? ? ? return FALSE ;
    ? ? ? ? }


    ? ? ? ? printf ( "%d bytes replay from %s : bytes=%d time=%dms\n", \
    ? ? ? ? ? ? nRet, inet_ntoa(SourSockAddr.sin_addr), nRealSize, nTime ) ;


    ? ? ? ? ::Sleep ( 1000 ) ;
    ? ? }


    ? ? closesocket ( RawSock ) ;
    ? ? WSACleanup () ;


    ? ? return TRUE ;
    }


    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 丝袜无码一区二区三区| 多人伦精品一区二区三区视频| 无码少妇一区二区| 国产91精品一区| 日韩爆乳一区二区无码| 国产美女av在线一区| 在线观看精品一区| 亚洲欧美日韩一区二区三区在线 | 视频一区二区精品的福利| 精品国产伦一区二区三区在线观看| 精品国产一区二区三区在线观看| 国产一区二区在线观看视频| 国产精品成人免费一区二区 | 久久精品国产免费一区| 久久精品国产一区二区| 乱人伦一区二区三区| 国产在线精品观看一区| 国产视频一区二区| 国产日韩精品一区二区三区| 亚洲综合无码一区二区痴汉 | 中文字幕人妻无码一区二区三区 | 国产福利91精品一区二区| 无码一区二区三区| 99久久精品国产一区二区成人| 亚洲AV无码一区二区二三区软件| 中文字幕一区二区三区永久 | 午夜福利一区二区三区高清视频| 国产亚洲一区二区手机在线观看| 99精品国产一区二区三区| 精品久久久久一区二区三区| 色视频综合无码一区二区三区| 亚洲国产激情一区二区三区| 精品视频一区二区三区| 日本亚洲成高清一区二区三区| 久久一本一区二区三区| 亚洲午夜在线一区| 国产精品免费视频一区| 成人无码一区二区三区| 无码人妻精品一区二区| 欧亚精品一区三区免费| 精品天海翼一区二区|