当前位置: 技术问答>linux和unix
我想在hp unix下开发一个ftp工具(c/c++),请高手给些资料或源码
来源: 互联网 发布时间:2015-10-31
本文导语: 我想在hp unix下开发一个ftp工具(c/c++),请高手给些资料或源码,找了很久没什么头绪,希望大家帮忙。多谢了 | 听你的意思是要开发一个图形化的ftp客户端吧。 首先要知道的是ftp协议需要...
我想在hp unix下开发一个ftp工具(c/c++),请高手给些资料或源码,找了很久没什么头绪,希望大家帮忙。多谢了
|
听你的意思是要开发一个图形化的ftp客户端吧。
首先要知道的是ftp协议需要的端口有两个:第一个是21端口,又叫控制端口,发往ftp服务器的命令都是发往这个端口的。第二个是20端口,也即数据端口,上传或者下载文件都是通过这个端口传递数据。因此你的客户端要建立两个socket,分别传送数据和命令。
二是主、被动模式。主动模式是ftp服务器传递数据时主动连接客户端某个端口,反之叫被动模式。
三是客户端的gui开发主要就是命令结果的重定向。把ftp服务端的返回结果显示在指定构件里,便于查看。
其实找个ftp客户端源代码看是最好的,我用过一个叫gftp的,利用gtk库开发,有一定学习价值,你可以搜索下。另外了解ftp协议是必须的,推荐一个网站:http://www.cnpaf.net/ 中国协议分析网。
首先要知道的是ftp协议需要的端口有两个:第一个是21端口,又叫控制端口,发往ftp服务器的命令都是发往这个端口的。第二个是20端口,也即数据端口,上传或者下载文件都是通过这个端口传递数据。因此你的客户端要建立两个socket,分别传送数据和命令。
二是主、被动模式。主动模式是ftp服务器传递数据时主动连接客户端某个端口,反之叫被动模式。
三是客户端的gui开发主要就是命令结果的重定向。把ftp服务端的返回结果显示在指定构件里,便于查看。
其实找个ftp客户端源代码看是最好的,我用过一个叫gftp的,利用gtk库开发,有一定学习价值,你可以搜索下。另外了解ftp协议是必须的,推荐一个网站:http://www.cnpaf.net/ 中国协议分析网。
|
看FTP源码只有这个办法。
|
开发FTP,不了解TCP/IP和FTP协议怎么做?楼主的意思令人费解
|
对,下载一个vsftp的源代码看看
|
楼主你试一下下面的函数,在Sco Unix没问题(我一直用这个),在Hp Unix我不知道行不行;
你试一下,我想应该差不多吧!
/*********************************************
flag= 取/发文件
local_name=本地文件
remote_name=对方文件
machine_name=机器名
**********************************************/
int FTPComm(flag,local_name,remote_name,machine_name,user,pwd,index)
char * flag,*local_name,*remote_name,*machine_name,*user,*pwd;
int index;
{
char homedir[100]; /* home dir */
char strcomm[200];
char ftperr[100];
char str1[100];
char buf[500],netrc[150]; /* program name */
int rc;
FILE * fpfile,*fp;
char logfile[80],errfile[80];
long num;
char s1[200];
char tmpfile[100];
/*初始化*/
/*取HOME目录*/
sprintf(homedir,"%s", getenv("HOME") );
if (strncmp(flag,"g",1) ==0) {
sprintf(strcomm," get %s %s",remote_name,local_name);
}
else {
sprintf(strcomm," put %s %s",local_name ,remote_name);
}
/*.netrc内容*/
sprintf(buf,"machine %s login %s password %s macdef initn %s nbyenn",
/*打开.netrc文件*/
sprintf( netrc,"%s/.netrc",homedir);
if( (fp=fopen(netrc,"w")) == NULL ) {
rc= 99;
goto Exit1;
}
fprintf(fp, buf);
fclose(fp);
/*修改权限*/
chmod(netrc, 0600);
/*执行*/
sprintf(buf,"ftp %s>/dev/null 2>/dev/null" ,machine_name);
rc = system(buf);
if( access(netrc, 0 ) != 0 )
unlink(netrc); /*删除.netrc*/
rc = rc / 256 ;
if (rc) {
rc= 5;
goto Exit1;
}else{
/*判是否成功*/
if (strncmp(flag,"g",1) ==0) { /*get*/
...
} else { /* put*/
sprintf(tmpfile,"tmp/%d.tmp.file",getpid());
rc= FTPComm("g",tmpfile,remote_name,machine_name,user,pwd,index);
goto Exit1;;
}
}
Exit1:
return (0);
}
你试一下,我想应该差不多吧!
/*********************************************
flag= 取/发文件
local_name=本地文件
remote_name=对方文件
machine_name=机器名
**********************************************/
int FTPComm(flag,local_name,remote_name,machine_name,user,pwd,index)
char * flag,*local_name,*remote_name,*machine_name,*user,*pwd;
int index;
{
char homedir[100]; /* home dir */
char strcomm[200];
char ftperr[100];
char str1[100];
char buf[500],netrc[150]; /* program name */
int rc;
FILE * fpfile,*fp;
char logfile[80],errfile[80];
long num;
char s1[200];
char tmpfile[100];
/*初始化*/
/*取HOME目录*/
sprintf(homedir,"%s", getenv("HOME") );
if (strncmp(flag,"g",1) ==0) {
sprintf(strcomm," get %s %s",remote_name,local_name);
}
else {
sprintf(strcomm," put %s %s",local_name ,remote_name);
}
/*.netrc内容*/
sprintf(buf,"machine %s login %s password %s macdef initn %s nbyenn",
/*打开.netrc文件*/
sprintf( netrc,"%s/.netrc",homedir);
if( (fp=fopen(netrc,"w")) == NULL ) {
rc= 99;
goto Exit1;
}
fprintf(fp, buf);
fclose(fp);
/*修改权限*/
chmod(netrc, 0600);
/*执行*/
sprintf(buf,"ftp %s>/dev/null 2>/dev/null" ,machine_name);
rc = system(buf);
if( access(netrc, 0 ) != 0 )
unlink(netrc); /*删除.netrc*/
rc = rc / 256 ;
if (rc) {
rc= 5;
goto Exit1;
}else{
/*判是否成功*/
if (strncmp(flag,"g",1) ==0) { /*get*/
...
} else { /* put*/
sprintf(tmpfile,"tmp/%d.tmp.file",getpid());
rc= FTPComm("g",tmpfile,remote_name,machine_name,user,pwd,index);
goto Exit1;;
}
}
Exit1:
return (0);
}
|
自己做一个不行吗?一定要遵从FTP协议?
|
学习。
|
楼主直接写个主函数,在主函数中调用FTPComm就可以了,在主函数中对相应的参数赋值即可
int main( int argc,char argv[] )
{
//参数定义
...
//对相关参数赋值
sprintf(machine_name,"%s","目标机器名" )
sprintf(user,"%s","登录用户名" )
sprintf(pwd,"%s","登录密码" )
...
rc= FTPComm("g",tmpfile,remote_name,machine_name,user,pwd,index);
flag,local_name,remote_name,machine_name,user,pwd,index
if( rc )
{
//判断函数调用结果
}
return 0
}
int main( int argc,char argv[] )
{
//参数定义
...
//对相关参数赋值
sprintf(machine_name,"%s","目标机器名" )
sprintf(user,"%s","登录用户名" )
sprintf(pwd,"%s","登录密码" )
...
rc= FTPComm("g",tmpfile,remote_name,machine_name,user,pwd,index);
flag,local_name,remote_name,machine_name,user,pwd,index
if( rc )
{
//判断函数调用结果
}
return 0
}
|
ftp 协议里没有dir这个命令,应该是
LIST [ ]
建议先看一下 RFC959
LIST [ ]
建议先看一下 RFC959
|
看RFC足够了。实现一个基本命令集就可以了。任何语言都能实现,只要它能建立socket.