netcat中无参数时的处理(2-1)

在使用netcat时,如果未输入参数,则此时会弹出“Cmd line”的提示,要求继续输入参数,如图1所示。

 

图1 Cmd line提示

在netcat源代码中,会获取用户在“Cmd line”中的输入,将参数提取出来。该段代码在main()函数中实现。

1 为参数地址分配内存

在main()函数中,有如下代码

if (argc == 1)

{

cp = argv[0];

argv = (char**)Hmalloc(128 * sizeof(char*));

argv[0] = cp;

cp = Hmalloc(BIGSIZ);

argv[1] = cp;

fprintf(stderr, "Cmd line:");

fflush(stderr);

        ....

 }

其中,cp在main()函数中定义,

register char *cp;

argc的值是1,则说明用户只输入了netcat名字,没有输入任何参数。此时,将argv[0]保存在cp中,之后调用自定义Hmalloc()函数动态分配128个字符指针的空间,也就是说,argv可以看成是一个包含128个指针的数组,即表示netcat可以带128-1=127个参数,最后,再将netcat的第一个参数,即netcat名字的地址保存在数组的第一个元素中中。

2 为第2个参数分配内存

在为128个参数地址分配内存,并且指定了第一个参数之后,接下来调用Hmalloc()函数为第2个参数分配BIGSIZ字节的空间,用于保存第2个参数。其中,BIGSIZ的定义为

#define BIGSIZ 8192

接下来调用fprintf()函数在控制台中输出“Cmd line”,用于提示用户输入netcat的参数,最后调用fflush()函数清空stderr流。

3 读取参数

当在Cmd line提示之后输入了netcat的参数并且按下回车按键之后,netcat应该读取这些参数。

insaved = _read(0, cp, BIGSIZ);

if (insaved <= 0)

{

bail("wrong");

}

其中,_read()函数的作用是从流中读取数据,该函数的第一个参数0指定了从标准输入流中读取数据;读取的数据保存在cp指向的内存中;读取数组的最大字节数是BIGSIZE。insaved中保存了实际读取的字节数,如果读取失败,则insaved的值小于或等于0。

发布了314 篇原创文章 · 获赞 206 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/103221996
2-1
今日推荐