为实现vxworks的目标机(vxsim模拟器)和vxworks主机之间的文件传输,需要先搭建vxworks网络环境,当vxworks主机和vxsim能实现网络通信以后,再利用ftp协议就能实现vxworks和vxsim之间的文件传输了。
关于vxworks网络环境的搭建,可以参考《ULIP及vxsim网络配置》(http://files.cnblogs.com/lotusswan/ULIP.doc)一文。网上有很多相关的文章,这里不再详述,唯一需要说明一点的是:
7、Launch target server,关闭Launch simulator后会提示你launch target server,点击Cancel,如果点击OK,会出现如下的错误提示:
"tgtsvr (vxTarget@heiwa): Wed Aug 25 00:17:08 1999
Wind River Systems Target Server: NT/Win95 version
Error: Target vxsim5 unknown. Attach failed.
Error: Backend initialization routine failed.
Problem during Backend initialization
Target Server will exit"
你根本无法连接上目标机。
当你按照上述的方式实现了主机和vxsim的通信以后,就可以编写ftp实现来实现文件传输了。
关于ftp的程序编写,其实是很容易的事情,vxworks已经为我们提供了几个API函数可供我们使用,这里主要介绍两个:ftpXfer和ftpCommand。对于ftpXfer,相信使用过tornado进行程序调试的朋友都不会陌生,当ftp没开或者是网络故障时,目标机在进行加载的时候往往就会报错:ftpXfer error,这个时候就是调用这个函数返回了错误码。下面我们看看这个函数的具体用法:
STATUS ftpXfer
(
char * host, /* ftp服务器的IP地址,点分十进制,格式类似于"127.0.0.1"*/
char * user, /* 访问ftp服务器的用户名*/
char * passwd, /* 访问ftp服务器的密码 */
char * acct, /* 一般不用,直接填写为空字符串就可以了。*/
char * cmd, /* 发送给FTP服务器的命令,例如读取命令为"RETR"*/
char * dirname, /* 待访问文件所在的目录*/
char * filename, /* 待访问文件的文件名*/
int * pCtrlSock, /* 存储返回的control socket文件描述符,也就是常说的fd*/
int * pDataSock /* 存储返回的待访问文件的文件描述符*/
)
相信看到函数声明以后,就会明白该函数的使用方式了,如果出错,返回值为ERROR。
下面再来看看ftpCommand的描述:
int ftpCommand
(
int ctrlSock, /* control socket的文件描述符 */
char * fmt, /* 待传递的ftp命令 */
int arg1, /* ftp命令的参数*/
int arg2,
int arg3,
int arg4,
int arg5,
int arg6
)
和ftpXfer一样,使用方式十分简单。
知道这两个函数以后,可以开始编写程序了,下面给出一个实例:
#include "errnoLib.h"
#include "ftpLib.h"
#define HOST "192.168.255.254"
#define USER "target"
#define PWD "123"
#define W_DIR "d:/downloads"
#define RD_CMD "RETR %s" /*get file from ftp server*/
#define FILE "log.txt"
void ftpGo()
{
/*semGive(sem_ftp); */
}
void ftp()
{
int ctrlSock;
int dataSock;
char buf[512];
int nBytes;
if(ERROR == ftpXfer(HOST, USER, PWD, "", RD_CMD, W_DIR, FILE, &ctrlSock, &dataSock))
{
printf("\r\n ftp connected failed!");
return ;
}
while((nBytes = read(dataSock, buf, sizeof(buf))) > 0)
{
printf("\r\n it is [%s]", buf);
}
close(dataSock);
if(ERROR == nBytes)
printf("\r\nit is reading error.");
if(ftpCommand(ctrlSock, "QUIT", 0, 0, 0, 0, 0, 0) == FTP_COMPLETE)
printf("\r\nftp is completed");
close(ctrlSock);
}
程序编写完成以后,就是调试了,调试也是很容易,直接在shell下输入ftp就可以看到主机上的文件内容被打印在屏幕上了。不过需要说明一点的是,vxworks自带的vxsim是不支持ftp访问的,因此需要自己编译一个vxsim虚拟机并且加上ftp client组件,至于这部分内容如何做到,相信你看完了《ULIP及vxsim网络配置》一文,应该不会有疑问。
祝大家好运!