tcpdump 相关

tcpdump 相关

有人可以告知我们可以通过哪些命令/代码来执行网络监控或调试活动吗tcpdump

答案1

/*
**  This is a small program to gather statistical data from tcpdump
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>

#define ROBOT_PATH  "/home2/frystyk"
#define ROBOT_HTTP10    "w3c-libwww-4.0D"
#define ROBOT_HTTP11    "w3c-libwww"
#define ROBOT_HTTP11PL  "w3c-libwww"
#define ROBOT       "Robot/src/webbot"

#define DEFAULT_HOST    "pfunk.w3.org"
#define DEFAULT_PORT    "8080"
#define DEFAULT_HOME    "/microscape/microscape.html"
#define ZIP_HOME    "/microscape/m.d.html"
#define DEFAULT_SLEEP   5

#define DEFAULT_LOG "tcpdump"
#define TCPDUMP     "/usr/local/sbin/tcpdump"

#define TEXT_SUFFIX "txt"
#define BIN_SUFFIX  "bin"

#define YES 1
#define NO  0

typedef enum _ProgMask {
    HTTP10  = 0x1,
    HTTP11  = 0x2,
    HTTP11PL    = 0x4,
    HTTP11PLZIP = 0x8,
    HTTPALL = 0xFF
} ProgMask;

extern char ** environ;

static char * tcpdump = TCPDUMP;
static char * robotpath = ROBOT_PATH;
static int    zzzz = DEFAULT_SLEEP;

void HelpScreen (const char *progname)
{
    fprintf(stderr, "\nA small program to gather statistical data from tcpdump\n");
    fprintf(stderr, "Usage: %s\n", progname ? progname : "getdata");
    fprintf(stderr, "Options:\n");
    fprintf(stderr, "\t-d\tDelay between each dump in seconds (default 5)\n");
    fprintf(stderr, "\t-l\tLogfile prefix, for example 'J-HH'\n");
    fprintf(stderr, "\t-o\tOther robot 5.1 command line options, for example '-delay 20'\n");
    fprintf(stderr, "\t-p\tPort on host, for example '8080'\n");
    fprintf(stderr, "\t-r\tPath for where to find the Robot executables, for example '/u1/frystyk'\n");
    fprintf(stderr, "\t-s\tHost we are connection to, for example 'pfunk.w3.org'\n");
    fprintf(stderr, "\t-t\tFull path for tcpdump program, for example '/usr/sbin/tcpdump'\n");
    fprintf(stderr, "\t-b\tGenerate binary tcpdump outputs instead of ascii\n");
    fprintf(stderr, "\t-w\tWhat tests to run (1=HTTP/1.0, 2=HTTP/1.1, 4=HTTP/1.1pl). Default is all\n\n");
}

static int CreateLogDir (const char * logdir)
{
    if (logdir) {
    struct stat stat_info;
    if (stat(logdir, &stat_info) == -1) {
        if (mkdir(logdir, 0777) < 0) return -1;
    }
    return 0;
    }
    return -1;
}

static char ** BuildArgv (const char * host, const char * port, char binary)
{
    char ** argv = NULL;
    if ((argv = (char **) calloc(20, sizeof(char *))) == NULL)
    exit (-10);
    *(argv+0) = "tcpdump";
    if (binary) {
    *(argv+1) = "-w";
    *(argv+2) = "-";
    } else {
    *(argv+1) = "-tt";
    *(argv+2) = "-S";
    }
    *(argv+3) = "host";
    *(argv+4) = host;
    *(argv+5) = "and";
    *(argv+6) = "port";
    *(argv+7) = port;
    return argv;
}


static int RunTest (const char * program, const char * url,
            const char * host, const char * port,
            const char * param, const char * log,
            char binary)
{
    int pid;
    if (program && host && port && log) {

    /* Set up tcpdump to run in a child progess */
    if ((pid = vfork()) < 0) {
        fprintf(stderr, "Can't fork child process\n");
        exit(-10);
    }
    if (pid == 0) {
        char **argv = NULL;
        int fd = -1;

        /* Build the calling parameters */
        argv = BuildArgv(host, port, binary);

        fprintf(stderr, "Child running as pid %d\n", getpid());

        /* Open log file and redirect stdout to it */

        if ((fd = open(log, O_WRONLY | O_CREAT | O_TRUNC,
               S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)) < 0) {
        fprintf(stderr, "Can't open file '%s'\n", log);
            exit(-5);
        }
        dup2(fd, STDOUT_FILENO);
        close(fd);

        /* Call tcpdump */
        if (execve(tcpdump, argv, environ)) {
        fprintf(stderr, "Can't run tcpdump program '%s'\n", tcpdump);
        exit (-5);
        }
        fprintf(stderr, "Shouldn't have come here\n");
        exit (5);

    } else {
        char cmd[512];
        fprintf(stderr, "Sleeping for %d secs\n", zzzz);
        sleep(zzzz);    /* Just to be on the safe side */
        sprintf(cmd, "%s %s %s", program, param ? param : "", url);
        fprintf(stderr, "Parent running command '%s'\n", cmd);
        if (system(cmd)) {
        fprintf(stderr, "Couldn't run command '%s'\n", cmd);
        exit(-20);
        }
        fprintf(stderr, "Sleeping for %d secs\n", zzzz);
        sleep(zzzz);    /* Just to be on the safe side */

        /* Now kill the child */
        {
        int status_location;
        fprintf(stderr, "Killing child with pid %d\n", pid);
        if (kill(pid, SIGINT))
            fprintf(stderr, "Can't kill pid %d\n", pid);
        waitpid(pid, &status_location, 0);
        }
    }
    return 0;
    }
    return -1;
}

int main (int argc, char ** argv)
{
    int arg;
    char program [512];
    char logdir [512];
    char logpath [512];
    char url [512];
    char param[512];
    char binary = NO;
    char * logprefix = DEFAULT_LOG;
    char * host = DEFAULT_HOST;
    char * port = DEFAULT_PORT;
    char * options = NULL;
    ProgMask mask = HTTPALL;
    char * suffix = TEXT_SUFFIX;

    /* Print help screen and exit */
    if (argc < 2) {
    HelpScreen(*argv);
    exit(0);
    }

    /* Scan command line for parameters */
    for (arg=1; arg<argc; arg++) {

    if (*argv[arg] == '-') {

        /* What server are we talking to? */
        if (!strcmp(argv[arg], "-s")) {
        host = (arg+1 < argc && *argv[arg+1] != '-') ?
            argv[++arg] : DEFAULT_HOST;

        /* What port are we talking to? */
        } else if (!strcmp(argv[arg], "-p")) {
        port = (arg+1 < argc && *argv[arg+1] != '-') ?
            argv[++arg] : DEFAULT_PORT;

        /* What logprefix file should we use */
        } else if (!strcmp(argv[arg], "-l")) {
        logprefix = (arg+1 < argc && *argv[arg+1] != '-') ?
            argv[++arg] : DEFAULT_LOG;

        /* Other options for HTTP/1.1 */
        } else if (!strcmp(argv[arg], "-o")) {
        options = (arg+1 < argc) ? argv[++arg] : NULL;

        /* What tcpdump program should we use */
        } else if (!strcmp(argv[arg], "-t")) {
        tcpdump = (arg+1 < argc && *argv[arg+1] != '-') ?
            argv[++arg] : TCPDUMP;

        /* Should we produce binary tcpdump output? */
        } else if (!strcmp(argv[arg], "-b")) {
        binary = YES;

        /* What robot base path should we use */
        } else if (!strcmp(argv[arg], "-r")) {
        robotpath = (arg+1 < argc && *argv[arg+1] != '-') ?
            argv[++arg] : ROBOT_PATH;

        /* What delay should we use betwen test runs */
        } else if (!strcmp(argv[arg], "-d")) {
        zzzz = (arg+1 < argc && *argv[arg+1] != '-') ?
            atoi(argv[++arg]) : DEFAULT_SLEEP;

        /* What tests to run */
        } else if (!strcmp(argv[arg], "-w")) {
        mask = (arg+1 < argc && *argv[arg+1] != '-') ?
            atoi(argv[++arg]) : HTTPALL;

        } else {
        fprintf(stderr, "Don't understand `%s\'\n", argv[arg]);
        HelpScreen(*argv);
        return 1;
        }
    } else {
        fprintf(stderr, "Don't understand `%s\'\n", argv[arg]);
        HelpScreen(*argv);
        return 1;
    }
    }

    /* Initialize variables */
    suffix = binary ? BIN_SUFFIX : TEXT_SUFFIX;


    /* Run test for HTTP/1.0 */
    if (mask & HTTP10) {
    int cnt = 0;
    sprintf(program, "%s/%s/%s", robotpath, ROBOT_HTTP10, ROBOT);
    sprintf(logdir, "%s-http-10", logprefix);
    sprintf(url, "'http://%s:%s%s'", host, port, DEFAULT_HOME);
    CreateLogDir(logdir);
    for (cnt=1; cnt<6; cnt++) {
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "ft", cnt, suffix); 
        if (RunTest(program, url, host, port,
            "-n -saveimg",
            logpath, binary)) exit (-5);
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "cv", cnt, suffix); 
        if (RunTest(program, url, host, port,
            "-n -img",
            logpath, binary)) exit (-5);
    }
    }

    /* Run test for HTTP/1.1 w/o pipelining */
    if (mask & HTTP11) {
    int cnt = 0;
    sprintf(program, "%s/%s/%s", robotpath, ROBOT_HTTP11, ROBOT);
    sprintf(logdir, "%s-http-11", logprefix);
    sprintf(url, "'http://%s:%s%s'", host, port, DEFAULT_HOME);
    CreateLogDir(logdir);
    for (cnt=1; cnt<6; cnt++) {
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "ft", cnt, suffix); 
        if (RunTest(program, url, host, port,
            "-saveimg -nopipe -cache -flush -n -q",
            logpath, binary)) exit (-5);
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "cv", cnt, suffix); 
        if (RunTest(program, url, host, port,
            "-saveimg -nopipe -cache -validate -n -q",
            logpath, binary)) exit (-5);
    }
    }

    /* Run test for HTTP/1.1 with pipelining */
    if (mask & HTTP11PL) {
    int cnt = 0;
    sprintf(program, "%s/%s/%s", robotpath, ROBOT_HTTP11PL, ROBOT);
    sprintf(logdir, "%s-http-11-pl", logprefix);
    sprintf(url, "'http://%s:%s%s'", host, port, DEFAULT_HOME);
    CreateLogDir(logdir);
    for (cnt=1; cnt<6; cnt++) {
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "ft", cnt, suffix); 
        sprintf(param, "-saveimg -cache -flush -n -q %s", options ? options : "");
        if (RunTest(program, url, host, port,
            param, logpath, binary)) exit (-5);

        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "cv", cnt, suffix);
        sprintf(param, "-saveimg -cache -validate -n -q %s", options ? options : "");
        if (RunTest(program, url, host, port,
            param, logpath, binary)) exit (-5);
    }
    }

    /* Run test for HTTP/1.1 with pipelining and compression */
    if (mask & HTTP11PLZIP) {
    int cnt = 0;
    sprintf(program, "%s/%s/%s", robotpath, ROBOT_HTTP11PL, ROBOT);
    sprintf(logdir, "%s-http-11-pl-zip", logprefix);
    sprintf(url, "'http://%s:%s%s'", host, port, ZIP_HOME);
    CreateLogDir(logdir);
    for (cnt=1; cnt<6; cnt++) {
        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "ft", cnt, suffix); 
        sprintf(param, "-saveimg -cache -flush -n -q %s", options ? options : "");
        if (RunTest(program, url, host, port,
            param, logpath, binary)) exit (-5);

        sprintf(logpath, "%s/run-%s-%d.%s", logdir, "cv", cnt, suffix);
        sprintf(param, "-saveimg -cache -validate -n -q %s", options ? options : "");
        if (RunTest(program, url, host, port,
            param, logpath, binary)) exit (-5);
    }
    }

    return 0;
}

相关内容