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

4 处理读取到的数据

4.1 按行读取数据

在通过_read()函数读取了用户输入的参数之后,接下来通过自定义函数findline()读取一整行的参数。

x = findline(cp, insaved);

if (x)

{

insaved -= x;

}

if (insaved)

{

memcpy(bigbuf_in, &cp[x], insaved);

}

其中,自定义函数findline()的详细解释请参考《netcat中findline()函数解析》。findline()的第一个参数cp保存了_read()函数中读取到的用户输入参数;第二个参数指定的cp的大小,而在以上代码中,insaved指定的并不是cp的大小,而是读取到的用户输入参数的大小。findline()函数的返回值是读取的第一行参数的大小。如果返回值大于0,则说明成功读取了参数,从读取到的参数大小insaved中减去当前第一行的参数大小x,即为读取之后还剩下的参数大小。如果读取了第一行后还有参数没有读取,则使用memcpy()函数将剩下的参数拷贝到bigbuf_in中。

4.2 替换回车符

在读取了用户输入的一行代码之后,将读取到的字符串中的回车赋替换为字符串结束符“\0”。

cp = strchr(argv[1], '\n');

if (cp)

{

*cp = '\0';

}

cp = strchr(argv[1], '\r');

if (cp)

{

*cp = '\0';

}

其中,argv[1]表示第二个参数的指针,该值在“1 为参数地址分配内存”中提到的代码中已经赋值为cp,所以对argv[1]操作,实际上就是对cp中的字符串进行操作。strchr()函数的作用是在字符串中找到指定的字符,该函数的返回值是找到的字符的位置。以上代码的作用是将用户输入的参数中的回车符替换为’\0’。

4.3 提取单个参数

argc表示用户输入参数的数量,而argv表示用户输入参数的指针。在将用户输入的参数回车符进行替换之后,就表示成功的提取了用户输入的所有参数,之后需要根据空格符将单个参数提取出来。

cp = argv[1];

cp++;

x = 2;

for (; *cp != '\0'; cp++)

{

if (*cp == ' ')

{

*cp = '\0';

continue;

}

else {

if (*(cp - 1) == '\0')

{

argv[x] = cp;

x++;

}

}

}

argc = x;

其中,for循环遍历了用户输入的所有参数,以空格符作为分隔符,当发现空格符时,将该空格符用’\0’替换。当前字符的前一个字符是’\0’时,表示是两个参数的分隔符,则提取参数,保存在argv中,并且将参数的数量加1,最后将参数的个数保存在argc中。

例如,在Cmd Line:的提示符后输入如图2所示的参数:

 

图2 输入参数

经过上述参数提取,argc的值是6,argv[0]-argv[5]分别保存了图2输入的参数。

扫描二维码关注公众号,回复: 11099547 查看本文章
发布了314 篇原创文章 · 获赞 206 · 访问量 61万+

猜你喜欢

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