⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ping.c

📁 arm lpc2000 应用历程 arm lpc2000 应用历程
💻 C
字号:

#define IN_PING

#include "config.h"

extern void OSPuts(char *cp);
extern uint8 IpcpCfg[];
extern NetHardDrivesSocket ModemDrive;

uint8 ICMPDataBuf[1500];

        uint16 ChkSum(uint16 SumFirst, uint16 *Data, uint16 Length)
{
    uint32 Sum;
    
    Sum = 0;
    Sum += SumFirst;
    
    while(Length > 1)
    {
        Sum += *Data++;
        Length -= 2;
    }
    if(Length > 0)
    { 
        Sum += *(uint8 *)Data;
    }
    while(Sum>>16)
    {
        Sum = (Sum & 0xffff) + ((Sum >> 16) & 0xffff);
    }
    return ~Sum;
}


        void PingAnswer(uint8 *Frame)
{
    union Netcard *np;
    uint16 NByte;
    uint8 temp,i;
    
    np = (union Netcard *)Frame;

    NByte = np->IpFrame.TotalLen[0] * 256 | np->IpFrame.TotalLen[1];
    np->IpFrame.ttl--;
    for (i = 0; i < 4; i++)
    {
        temp = np->IpFrame.SourceIp[i];
        np->IpFrame.SourceIp[i] = np->IpFrame.DestIp[i];
        np->IpFrame.DestIp[i] = temp;
    }
    np->IpFrame.Sum = 0;
    np->IpFrame.Sum = ChkSum(0, np->WordBuf, 20);

    np->IcmpFrame.type = 0;
    np->IcmpFrame.Sum = 0;
    np->IcmpFrame.Sum = ChkSum(0, np->WordBuf + 10, NByte - 20);
    np->IcmpFrame.type = 0x00;
    PPPDriveWrite(&ModemDrive, Frame - 2, NByte + 2);
}

        void IPGetFrame(uint8 *Frame)
{
    union Netcard *np;
//    int8 s[200];

    np = (union Netcard *)Frame;
    
    if (((np->IpFrame.VerandIphLen) & 0xf0) == 0x40)
    {
        switch(np->IpFrame.NextProtocal)
        {
            case 1://表示为icmp协议
                
//sprintf(s, "Get a ICMP Frame From %u.%u.%u.%u to %u.%u.%u.%u\n", 
//            np->IpFrame.SourceIp[0], np->IpFrame.SourceIp[1],
//            np->IpFrame.SourceIp[2], np->IpFrame.SourceIp[3],

//            np->IpFrame.DestIp[0], np->IpFrame.DestIp[1],
//            np->IpFrame.DestIp[2], np->IpFrame.DestIp[3]);
//OSPuts(s);

                if((np->IcmpFrame.type) == 8) //是一个ping的请求包
                {
                    //OSPuts("Get a ping request\n");
                    PingAnswer(Frame);
                }
                else if(np->IcmpFrame.type == 0)
                {
                    //OSPuts("Get a ping Answer\n");
                    OSTimeDlyResume(22);
                } //是一个ping的应答包
                break;
            case 6: //表示是tcp协议
//                OSPuts("Get a TCP Frame\n");
                break;
            case 0x11: //表示是udp协议
//                OSPuts("Get a UDP Frame\n");
                break;
            default:
                break;
        }
    }
}

uint16 IPFrameIndex = 0;

            void Ping(void *Pdata)
{
    uint8 *cp;
    union Netcard * ICMPData;
    uint32 Now;
    uint8 i;
    char s[80];
    
    cp = (uint8 *)Pdata;
    
    IPFrameIndex = 0;

    ICMPData = (union Netcard *)(ICMPDataBuf + 2);
    ICMPDataBuf[0] = 0x00;
    ICMPDataBuf[1] = 0x21;
    
    ICMPData->IpFrame.VerandIphLen = 0x45;
    ICMPData->IpFrame.ServerType = 0;
    ICMPData->IpFrame.TotalLen[0] = 0;
    ICMPData->IpFrame.TotalLen[1] = 60;
    ICMPData->IpFrame.ttl = 0x80;

    ICMPData->IpFrame.Segment[0] =0;
    ICMPData->IpFrame.Segment[1] =0;
    
    ICMPData->IpFrame.NextProtocal = 0x01;

    ICMPData->IpFrame.SourceIp[0] = IpcpCfg[8];
    ICMPData->IpFrame.SourceIp[1] = IpcpCfg[9];
    ICMPData->IpFrame.SourceIp[2] = IpcpCfg[10];
    ICMPData->IpFrame.SourceIp[3] = IpcpCfg[11];

//    ICMPData->IpFrame.DestIp[0] = 192;
//    ICMPData->IpFrame.DestIp[1] = 168;
//    ICMPData->IpFrame.DestIp[2] = 0;
//    ICMPData->IpFrame.DestIp[3] = 2;

    ICMPData->IpFrame.DestIp[0] = *cp++;
    ICMPData->IpFrame.DestIp[1] = *cp++;
    ICMPData->IpFrame.DestIp[2] = *cp++;
    ICMPData->IpFrame.DestIp[3] = *cp;



    ICMPData->IcmpFrame.type = 0x08;
    ICMPData->IcmpFrame.option = 0;
    ICMPData->IcmpFrame.id[0] = 0x03;
    ICMPData->IcmpFrame.id[1] = 0x00;
    
    cp -= 3;
    sprintf(s, "ping %u.%u.%u.%u...\n", cp[0], cp[1], cp[2], cp[3]);
    OSPuts(s);
/*    
    for (i = 0; i < 40; i++)
    {
        ICMPData->IpFrame.ttl = i + 1;
        ICMPData->IpFrame.FrameIndex[0] = IPFrameIndex / 256;
        ICMPData->IpFrame.FrameIndex[1] = IPFrameIndex % 256;
        ICMPData->IpFrame.Sum = 0;
        ICMPData->IpFrame.Sum = ChkSum(0, ICMPData->WordBuf, 20);
    
        ICMPData->IcmpFrame.seq[0] = IPFrameIndex / 256;
        ICMPData->IcmpFrame.seq[1] = IPFrameIndex % 256;
        ICMPData->IcmpFrame.Sum = 0;
        ICMPData->IcmpFrame.Sum = ChkSum(0, ICMPData->WordBuf + 10, 40);

        IPFrameIndex++;

        PPPDriveWrite(&ModemDrive, ICMPDataBuf, 62);

        Now = OSTimeGet();
        OSTimeDly(OS_TICKS_PER_SEC * 2);
        Now = (OSTimeGet() - Now) * (1000 / OS_TICKS_PER_SEC);
        if(Now < 2000)
        {
            sprintf(s, "Reply Form %u.%u.%u.%u; time = %ums\n", cp[0], cp[1], cp[2], cp[3], Now);
            OSPuts(s);
        }
        else
        {
            OSPuts("Ping Time Out\n");
        }
        
    }
*/    
    for (i = 0; i < 4; i++)
    {
        ICMPData->IpFrame.FrameIndex[0] = IPFrameIndex / 256;
        ICMPData->IpFrame.FrameIndex[1] = IPFrameIndex % 256;
        ICMPData->IpFrame.Sum = 0;
        ICMPData->IpFrame.Sum = ChkSum(0, ICMPData->WordBuf, 20);
    
        ICMPData->IcmpFrame.seq[0] = IPFrameIndex / 256;
        ICMPData->IcmpFrame.seq[1] = IPFrameIndex % 256;
        ICMPData->IcmpFrame.Sum = 0;
        ICMPData->IcmpFrame.Sum = ChkSum(0, ICMPData->WordBuf + 10, 40);

        IPFrameIndex++;

        PPPDriveWrite(&ModemDrive, ICMPDataBuf, 62);
        
        Now = OSTimeGet();
        OSTimeDly(OS_TICKS_PER_SEC * 2);
        Now = (OSTimeGet() - Now) * (1000 / OS_TICKS_PER_SEC);
        if(Now < 2000)
        {
            sprintf(s, "Reply Form %u.%u.%u.%u; time = %ums\n", cp[0], cp[1], cp[2], cp[3], Now);
            OSPuts(s);
        }
        else
        {
            OSPuts("Ping Time Out\n");
        }
    }
    OSPuts("Ping exit\n");
    OSTaskDel(OS_PRIO_SELF);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -