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输入的参数。