资源简介

利用RawSocket实现简单的Ping程序 ICMP协议 编程语言 C++ 操作系统 Linux(Ubuntu 10.0) 开发环境(可选)Qt4.7.0

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include “ping.h“
#include 
#include 
#include 
#include 
#include 
#include 
#define MAX_SEND_TIME 4

void ping(char *ip);
void sigint(int sig);
void (*signal_set(int signo void (*func)(int)))(int);
void signal_init();

char ip[100];
//unsigned long ip[100];

int main(int argc char *argv[])
{
        //参数检查
        if(argc != 3)
        {
                printf(“Usage: ./rawSock -n(1 or 2) IP \n“);
                exit(1);
        }

        //ping单一地址
        if (strcmp(argv[1]“-1“)== 0)
        {
           qDebug()<<“argv[2]“<           unsigned char*p;
           p = (unsigned char*)argv[2];
       /*  sprintf(ip “%d.%d.%d.%d“ p[0] p[1] p[2] p[3]);
           qDebug()<<“p[3]“<           qDebug()<<“ip“<*/
            memcpy(ip argv[2] sizeof(argv[2]));
            int i_ip = atoi(ip);
            qDebug()<<“i_ip“<            ping(argv[2]);

            return 0;
        }

        //遍历子网内所有地址
        if(strcmp(argv[1] “-2“) == 0)
        {
            char * last;
            int i;
            char ping_ip[20];
            int len;
            //字符串处理 通过拼接字符串显示所有遍历的地址
            last = strrchr( argv[2] ‘.‘);
            len = last - argv[2];
            argv[2][len] = ‘\0‘;
            for(i = 1 ; i < 255 ; i ++)
            {
                sprintf(ping_ip “%s%c%d“ argv[2] ‘.‘ i);
                ping(ping_ip);
            }
            return 0;
        }



}

void ping(char *ip)
{
        int sockfd;
        struct sockaddr_in dstaddr;
        int times = 0;

        if((sockfd = socket(AF_INET SOCK_RAW IPPROTO_ICMP)) == -1)
        {
                printf(“Create Socket Fail!\n“);
                exit(1);
        }

        //填补目的地址
        dstaddr.sin_family = AF_INET;
        dstaddr.sin_port = htons(0);
        if(inet_pton(AF_INET ip &dstaddr.sin_addr) == -1)
        {
                printf(“Get IP %s Error!\n“ ip);
                exit(1);
        }

        //设置信号
        signal_init();

        //输出ping信息
        printInfo(ip);

        // 循环发送ICMP包 回显
        while(times < MAX_SEND_TIME)
        {
                sendPing(sockfd &dstaddr);
                recvPing(sockfd &dstaddr);
                times++;
             //   print_stat(ip);
        }
        qDebug()<<“ssssssss“;

        //输出统计信息
        printState(ip);
}

/* SIGINT信号处理函数 发送消息*/
void sigint(int sig)
{
        printState(ip);
        exit(0);
}


/* 进程信号设置函数 */
void (*signal_set(int signo void (*func)(int)))(int)
{
        int ret;
        struct sigaction sig;
        struct sigaction osig;

        sig.sa_handler = func;
        sigemptyset(&sig.sa_mask);
        sig.sa_flags = 0;
#ifdef SA_RESTART
        sig.sa_flags |= SA_RESTART;
#endif /* SA_RESTART */

        ret = sigaction(signo &sig &osig);

        if (ret < 0)
                return (SIG_ERR);
      

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1150  2010-11-29 11:01  rawsock\ping.h

     文件       3332  2010-11-29 10:58  rawsock\main.cpp

     文件      10990  2010-11-29 15:00  rawsock\ping.cpp

     目录          0  2010-12-13 23:44  rawsock

----------- ---------  ---------- -----  ----

                15472                    4


评论

共有 条评论