在使用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应该读取这些参数。
扫描二维码关注公众号,回复:
11099572 查看本文章
insaved = _read(0, cp, BIGSIZ);
if (insaved <= 0)
{
bail("wrong");
}
其中,_read()函数的作用是从流中读取数据,该函数的第一个参数0指定了从标准输入流中读取数据;读取的数据保存在cp指向的内存中;读取数组的最大字节数是BIGSIZE。insaved中保存了实际读取的字节数,如果读取失败,则insaved的值小于或等于0。