- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Unix环境下Ftp的编程实现
赵宪林
(西安交通大学,陕西 西安 710049)
摘要:在Unix环境中,利用Ftp编程实现网络间大量数据文件的传输。结合实例阐述了Unix下Ftp的编程实现.
关键词:Unix、Ftp、文件传输
1 概述
对大批数据传输Ftp都是一个比较好的选择。下面就开发银行和电信系统实践的基础上,提供Unix下的Ftp的编程实现。
2 实现原理
Ftp即文件传输协议,它定义了在两台机器间传输文件的规程。有别于Ftp,Tftp比较简单。Tftp没有安全性和身份验证,而且最重要的区别是Tftp是基于数据报协议(UDP),不具有可靠性。Tftp用于已知的小型文件的传输。Ftp在机器之间维护两个逻辑连接,一个连接使用Telnet协议进行登录,另外一条连接用于数据传输。Ftp规定了许多用于两个进程间正确进行文件传输的应答。这些应答是由Ftp命令执行结果产生的。应答包括三个数字和一些信息。第一个数字表示五种类型应答,第二个数字包含了应答的附加信息,第三个数字更加详细的说明应答。第一个数字为1,表示一个肯定初步应答;2表示请求成功;3表示请求成功,缺乏额外的信息,如密码;4表示请求失败,可以继续发请求;5表示失败,不能再接收请求。详细的应答数字信息可以参阅RFC959。
Ftp传输文件时,支持不同的传输模式,有Ascii和Bin模式。在传输可执行文件和数据文件时最好使用Bin模式。
首先通过建立一个到对方主机的TCP/IP连接,用于传输登录信息和其他控制命令。由于Ftp是基于TCP之上的应用协议,建立的连接也必须是基于TCP的。然后传送Ftp用户和密码,这些必须是被连接方主机的合法帐号。登录成功以后就建立了到对方UnixFtpsever主机的有效连接。可以通过这个连接发送Ftp请求。如查看和改变目录,设置传输模式,上载或下载文件。
在进行数据文件的传输时,我们必须建立一个新的Socket,将Bind到一个新的服务端口,并通过Port指令告诉FTP?Server这个服务位置,然后通过这个数据服务端口收发数据Unix主机间进行文件传输,必须在对等的Ftpsever设置Ftp用户和密码,对方才能登录。在这里,选用C语言作为编程语言。C语言在Unix环境下的程序开发中应用最多的。
4 程序实现
下面给出程序的伪代码:
(1)获得返回信息函数
int get_reply(int sd)
{…
tcp_recv(sd, g_reply[i]) ;
/*从sd接收信息到g_reply*/
sscanf(g_reply, %d, code);
/*从返回信息中取到应答码*/
return code;
}
(2)发送命令函数:
int ftp_cmd(int sd, char *cmd, int success_code)
{…
tcp_send(sd, cmd, strlen(cmd));
/* 向sd端口发送cmd字符串;*/
if((code =get_reply(sd)) !=success_code) return -2;
/* success_code是发送命令后期望得到的应答码*/
return 0;
}
说明:sd为控制连接的端口号;
(3)主程序伪代码:
void main{…
char *p1, *p2,temp[256];
struct sockaddr_in addr1;
int code, sd_data=-1,len,sd;
struct hostent *hp;
…
sd =tcp_connect(hostname, FTP_PORT);
/*对对方的FTP_PORT实现一个逻辑连接sd*/
ftp_cmd(sd, USER 用户名\r\n,331) ;
/*传送用户名*/
ftp_cmd(sd, PASS 密码\r\n, 230);
/*传送对应的密码*/
sd_data =tcp_bind(0);
/*创建一个本地半连接socket,sd_data */
len =sizeof(addr1);
if(gethostname(temp, sizeof(temp)) !=0) return -1;
if((hp =gethostbyname(temp)) ==NULL) return -1;
if(getsockname(sd_data, (struct sockaddr *)addr1, len) 0) return -1;
p1 =(char *)hp-h_addr;
p2 =(char *)addr1.sin_port;
sprintf(temp, PORT %d,%d,%d,%d,
文档评论(0)