Tcpxtract中c语言函数学习

Tcpxtract是用来从网卡抓包并将其还原成文件的一个开源软件,它的基本原理是在抓取的数据包中匹配文件的特征头和特征尾。

下面对其中用的库函数进行了学习:

            void * memset(void*s,int ch,size_t n):将s指向的内存地址中的前n个字节用ch中的内容替换,并返回修改后的s。通常用于初始化新申请的变量;

#include <string.h>or#include<memory.h>

           int getopt_long (int argc, char *const argv[], const char*shortopts, const struct option *longopts, int longindex) ;#include <getopt.h>

argc与argv是main函数的两个参数,shortopts--字符数组,表示短选项(不要加-),如果需要指定该该选项一定需要参数,则可在该选项后面添加冒号,否则连着写即可;如字符数组optstring:odb:c表示选项b一定要有参数,而o/d/c选项可以没有参数;

option是一个结构体,又叫长选项表,它的定义如下:

struct option

{

     const char* name;//该长选项的名字

     int has_arg;//是否一定需要参数,有三种情况:#define no_argument 0(不需要参数) #define required_argument 1(必选参数) #define optional_argument 2(参数可选)

     int *flag;//一般用NULL

     int val;};//该长选项对应的短选项

option数组要求最后一个元素的内容为{NULL,0,NULL,0};

对应上面的短选项,可以将长选项定义

struct option *longoptions {

 {"open",0,NULL,'o'},

 {"data",0,NULL,'d'},

 {"busy",1,NULL,'b'},

 {"count",0,NULL,'c'},

 {NULL,0,NULL,0}

};可以看出这个长选项的作用就在于将长选项和短选项建立一一对应的关系

函数第四个参数和结构体option的第四个参数一样,设为NULL即可。调用时形式为:c=getopt_long(argc,argv,optstring,longoptions,NULL )c为选项;

调用该函数后,每个选项的参数会被存放在一个叫做optarg的全局变量中(字符指针),可以随时使用(只保存最后一个的输入)。

getopt系函数还会在得到选项时改变数组argv中元素的顺序,有另一个相关的参数是optind,它初始值为1,每次getopt函数执行之后,指向下一个可以作为选项参数的argv中元素的位置,如执行下面的程序:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void
main(int argc,char **argv)
{
 char c;
 while((c=getopt(argc,argv,"ab:c:d"))!=-1)
 {
  printf("%d,%s\n",optind,argv[optind]);
  switch(c)
   {
    case 'a':
    printf("Have option -a%s\n",optarg);    
    break;
    case 'b':
    printf("Have option -b%s\n",optarg);
    break;
    case 'c':
    printf("Have option -c%s\n",optarg);
    break;
    case 'd':
    printf("Have option -d%s\n",optarg);
    break;    
    }
 }
for(;optind<argc;optind++)    
    printf("%d,%s\n",optind,argv[optind]);
}

得到的结果为:

./a.out  file1 -b file2 file3 -c file4 file5 file6
4,file3
Have option -bfile2
7,file5
Have option -cfile4
5,file1
6,file3
7,file5
8,file6

上面的分析为:执行第一次getopt函数之后,得到b选项的参数,接着optind指向argv的第四个位置(argv的第0个位置不考虑),下一次getopt时,得到了c选项的参数,optind指向argv的第7个位置,在这个过程中optind跳过了位置1,4,7,8的printf,是因为他们都时非选项的参数,同时optind标识下一个getopt的开始位置。循环结束后,argv数组变为了-b file2 -c file4 file1 file3 file5 file6(没有考虑argv[0],它为执行文件名,这里无影响),optind重新被设置为5,也就时下一个getopt开始的位置(前4个参数均为选项或者选项对应的参数,也就是分配已经完成)。

getopt_long()函数有个兄弟,getopt(),原型为:

int getopt(int argc, char * const argv[], const char *optstring);optstring与上面的shortopts格式一样。

char* sdup=char * strdup (const char *s),函数返回一个指向字符串s的副本的指针,由于副本另外申请了内存,对sdup的操作不会影响s指向的字符串。

void perror(const char *s):根据上一个函数出错原因打出相应字符串,S所指向的字符串会先打印。原因是根据全局变量errno确定,因为某些函数在出错的时候会重新设置errorn的值,使它能对应函数出错原因的字符串。使用该函数 的时候需要包含头文件stdio.h与stdlib.h

这个网址有libpcap函数库的说明,先收藏一下http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=libpcap%E5%87%BD%E6%95%B0%E5%BA%93

void assert(int expression)--如果expression的结果为false,则assert先打印一条出错的信息,然后调用abort程序中止该进程。它的主要作用在于用来加入调试信息,可以明确出错的地方。使用的时候需要加入头文件assert.h

search函数,定义在search.c中,代码如下:

srch_results_t *search(srch_node_t *tree, srchptr_list_t **srchptr_list, uint8_t *buf, size_t len)
{
    srch_results_t *retval = NULL;
    int i;
    
    assert(tree != NULL);
    assert(srchptr_list != NULL);
    assert(buf != NULL);

    for (i = 0; i < len; i++)
        update_search(tree, srchptr_list, &retval, buf[i], i);
        
    return retval;
}

暂停下---

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章