前台传递字符串reqbuf:
ftp服务器IP\r\n端口\r\n用户名\r\n密码\r\nftp路径\r\n\r\n
解析reqbuf,重新组装成系统命令,去执行ftptest.sh脚本,
调用system函数,执行以上系统命令,结果日志打印到/tmp/ftptest.log中,读取日志进行结果判断:如果是230,则登录成功。
登录成功时,日志记录如下:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ip:192.168.51.206
端口:21
用户名:ftp
密码:123456
ftptest.sh脚本:
#!/bin/bash
logfile="/tmp/ftptest.log"
ftp -i -n -v<<EOF>$logfile
open $1 $2 (IP、端口)
user $3 $4 (用户名、密码)
cd $5 (路径)
bye
EOF
测试结果打印到/tmp/ftptest.log,通过查看log文件中的状态码判断测试成功
logroot@webwall:/home/xiachengjiao/nnba/nnba/mise/calls# vi /tmp/ftptest.log
调试日志目录:
Vi /webwall/var/run/debug.ftptest
while(!feof(fp))
{
if(fgets(statusnum, sizeof(statusnum), fp) == NULL)
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "get statusnum error!\n");
ERR
}
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "statusnum=%s\n", statusnum);
if((testdir == 0) && ((ackstatus = strncmp(statusnum, "230", 3)) == 0))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务登录成功\n");
break;
}
else if((testdir == 1) && ((ackstatus = strncmp(statusnum, "250", 3)) == 0))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务器文件路径测试成功\n");
break;
}
}
if(feof(fp))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务器测试失败\n");
ERR
}
这个程序不能测试出ip或端口等配置错误的情况。错误出在feof()函数上面;。当/tmp/ftptest.log日志内容如下:
Not connected.
Not connected.
程序执行结果是:
get statusnum error!
程序修改如下:
if(fgets(statusnum, sizeof(statusnum), fp) == NULL)
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "get statusnum error!\n");
ERR
}
while(!feof(fp))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "statusnum=%s\n", statusnum);
if((testdir == 0) && ((ackstatus = strncmp(statusnum, "230", 3)) == 0))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务登录成功\n");
break;
}
else if((testdir == 1) && ((ackstatus = strncmp(statusnum, "250", 3)) == 0))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务器文件路径测试成功\n");
break;
}
#if 0
if(fgets(statusnum, sizeof(statusnum), fp) == NULL)
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "get statusnum error!\n");
ERR
}
#endif
fgets(statusnum, sizeof(statusnum), fp);
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "statusnum=%s\n", statusnum);
}
if(feof(fp))
{
DEBUGLOG(IW_LOG_MAINBRANCE, DEBUG, "ftp服务器测试失败\n");
ERR
}
当log日志内容不变时,程序执行结果是
[30881]2013-05-21 15:53:45 ftptest.c[83]: DoService
statusnum=Not connected.
[30881]2013-05-21 15:53:45 ftptest.c[102]: DoService
statusnum=Not connected.
[30881]2013-05-21 15:53:45 ftptest.c[83]: DoService
statusnum=Not connected.
[30881]2013-05-21 15:53:45 ftptest.c[102]: DoService
statusnum=Not connected.
[30881]2013-05-21 15:53:45 ftptest.c[106]: DoService
ftp服务器测试失败
分析:feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。
EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文件结束标志。[1]
当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。
“C”语言的“feof()”函数和数据库中“eof()”函数的运作是完全不同的。数据库中“eof()”函数读取当前指针的位置,“C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混,从而造成了对这一概念的似是而非。
那么,位置和内容到底有何不同呢?举个简单的例子,比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。
在“C”文件读取操作时不能完全依赖于“while(!feof(FP)){...}”的判断。下面代码是改进后的代码,该代码执行后output文件内容和input文件内容一致,与使用“while(!feof(FP)){...}”相比,input文件的结尾符号(EOF)没有被读入到output文件中。
ftp服务器测试:脚本实现
bug:测试错误的时候不能检测出来。程序逻辑有问题,。,,所以以后做单元测试的时候必须要把可能出现的情况都测试全面。