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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值