tcp ip编程实现远程文件传输

上传人:第*** 文档编号:32818717 上传时间:2018-02-12 格式:DOC 页数:6 大小:39KB
返回 下载 相关 举报
tcp ip编程实现远程文件传输_第1页
第1页 / 共6页
tcp ip编程实现远程文件传输_第2页
第2页 / 共6页
tcp ip编程实现远程文件传输_第3页
第3页 / 共6页
tcp ip编程实现远程文件传输_第4页
第4页 / 共6页
tcp ip编程实现远程文件传输_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《tcp ip编程实现远程文件传输》由会员分享,可在线阅读,更多相关《tcp ip编程实现远程文件传输(6页珍藏版)》请在金锄头文库上搜索。

1、TCP/IP 编程实现远程文件传输在 TCP/IP 网络结构中,为了保证网络安全,网络人员往往需要在路由器上添加防火墙,禁止非法用户用FTP 等安全危害较大的 TCP/IP 协议访问主机。而有时系统维护人员需要用 ftp 将一些文件从中心机房主机传到前端网点主机上,比如应用程序的替换升级。如果每次传输文件时都要打开防火墙,未免显得有些繁琐,要是在自己的应用程序中增加一个专门的文件传输模块,那将是十分愉快的事情。UNIX 网络程序设计一般都采用套接字(socket)系统调用。针对目前十分流行的客户/服务器模式,其程序编写步骤如下:1.Socket 系统调用为了进行网络 I/O,服务器和客户机两端

2、的 UNIX 进程要做的第一件事是调用 socket()系统调用,建立软插座,指明合适的通讯协议。格式为:include sys/types.hinclude sys/socket.hint socket(int family,int type,int protocol)其中:(1)family 指明套节字族,其值包括:AF_UNIX (UNIX 内部协议族)AF_INET (Iternet 协议)AF_NS (XeroxNs 协议,TCP/IP 编程取该值)AF_IMPLINK (IMP 链接层)(2)type 指明套接字类型,取值有:SOCK_STREAM (流套接字 )SOCK_DGRA

3、M (数据报套接字)SOCK_RAW (原始套接字)SOCK_SEQPACKET (定序分组套接字)一般情况下,前两个参数的组合就可以决定所使用的协议,这时第三个参数被置为 0,如果第一个参数为 AF_INET,第二个参数选 SOCK_STREAM,则使用的协议为 TCP;第二个参数选 SOCK_DGRAM,则使用的协议为 UDP;当第二个参数选 SOCK_RAW 时,使用的协议为 IP。值得指出的是并不是所有的族和类型的组合都是合法的,具体请查阅相关资料。该系统调用若成功则返回一个类似文件描述符,成为套节字描述字,可以像文件描述符那样用 read 和 write 对其进行 I/O 操作。当一

4、个进程使用完该软插座时,需用 close()关闭(具体见后面内容 )。2.服务器端 Bind 系统调用软插座创建时并没有与任何地址相关联,必须用 bind()系统调用为其建立地址联系。其格式为:include include int bind(int socketfd,strUCt sockaddr_in localaddr,sizeof(localaddr);其中:(1)第一个参数 socketfd 是前步 socket()系统调用返回的套节字描述符。(2)第二个参数被捆向本地地址的一种结构,该结构在 sys/netinet/in.h 中定义:struct sockaddr_inshort

5、sin_family;/socket()系统调用的协议族如 AF_INET /u_short sin_port;/网络字节次序形式的端口号码/struct in_addr sin_addr;/网络字节次序形式的网络地址/char sin_zero8;一台机器上的每个网络程序使用一个各自独立的端口号码,例如:telnet 程序使用端口号 23,而 ftp文件传输程序使用端口号 21。我们在设计应用程序时,端口号码可以由 getservbyname()函数从/etc/services 库文件中获取,也可以由 htons (int portnum)函数将任意正整数转换为网络字节次序形式来得到,有些版

6、本的 UNIX 操作系统则规定 1024 以下的端口号码只可被超级用户使用,普通用户程序使用的端口号码只限于 1025 到 32767 之间。网络地址可以由 gethostbyname(charhostname)函数得到(该函数和getservbyname()一样都以网络字节次序形式返回所有在他们结构中的数据),参数 hostname 为/etc/hosts 文件中某一网络地址所对应的机器名。该函数返回一个类型为 hostent 的结构指针,hostent 结构在 netdb.h 中定义:struct hostentchar h_name;char h_aliases;int h_addrty

7、pe;int h_length; /地址长度 /char h_addr_list; define h_addr h_addr_list0;/地址/(3)第三个参数为第二个结构参数的长度,如果调用成功,bind 返回 0,否则将返回1 并设置 errno。3.服务器端系统调用 listen,使服务器愿意接受连接格式:int listen(int socketfd,int backlong)它通常在 socket 和 bind 调用后在 accept 调用前执行。第二个参数指明在等待服务器执行 accept 调用时系统可以排队多少个连接要求。此参数常指定为 5,也是目前允许的最大值。4.服务器调用

8、 accept,以等待客户机调用 connect 进行连接。格式如下:int newsocket=(int socketfd,struct sockaddr_in peer,intaddrlen);该调用取得队列上的第一个连接请求并建立一个具有与 sockfd 相同特性的套节字。如果没有等待的连接请求,此调用阻塞调用者直到一连接请求到达。连接成功后,该调用将用对端的地址结构和地址长度填充参数 peer 和 addlen,如果对客户端的地址信息不感兴趣,这两个参数用 0 代替。5.客户端调用 connect()与服务器建立连接。格式为:connect(int socketfd,struct so

9、ckaddr_in servsddr,int addrlen)客户端取得套接字描述符后,用该调用建立与服务器的连接,参数 socketfd 为 socket()系统调用返回的套节字描述符,第二和第三个参数是指向目的地址的结构及以字节计量的目的地址的长度(这里目的地址应为服务器地址)。调用成功返回 0,否则将返回1 并设置 errno。6.通过软插座发送数据一旦建立连接,就可以用系统调用 read 和 write 像普通文件那样向网络上发送和接受数据。Read 接受三个参数:一个是套节字描述符;一个为数据将被填入的缓冲区,还有一个整数指明要读的字节数,它返回实际读入的字节数,出错时返回1,遇到文

10、件尾则返回 0。Write 也接受三个参数:一个是套节字描述符;一个为指向需要发送数据的缓冲区,还有一个整数指明要写入文件的字节个数,它返回实际写入的字节数,出错时返回1。当然,也可以调用 send 和 recv 来对套节字进行读写,其调用与基本的 read 和write 系统调用相似,只是多了一个发送方式参数。7.退出程序时,应按正常方式关闭套节字。格式如下:int close(socketfd)前面介绍了 UNIX 客户/服务器模式网络编程的基本思路和步骤。值得指出的是 socket 编程所涉及的系统调用不属于基本系统调用范围,其函数原形在 libsocket.a 文件中,因此,在用 cc

11、 命令对原程序进行编译时需要带lsocket 选项。现在,我们可以针对文章开头提出的问题着手进行编程了。在图示的网络结构中,为使中心机房的服务器能和网点上的客户机进行通信,需在服务器端添加通过路由器 1112 到客户机的路由,两台客户机也必须添加通过路由器 2221 到服务器的路由。在服务器的/etc/hosts 文件中应该包含下面内容:1.1.1.1server2.2.2.2cli12.2.2.3cli2客户机的/etc/hosts 文件中应该有本机地址信息和服务器的地址信息,如 cli1 客户机的/etc/hosts 文件:2.2.2.2cli11.1.1.1server网络环境搭建好后,

12、我们可以在服务器端编写 fwq.c 程序,负责接受客户机的连接请求,并将从源文件中读取的数据发送到客户机。客户机程序 khj.c 向服务器发送连接请求,接收从服务器端发来的数据,并将接收到的数据写入目标文件。源程序如下:/服务器源程序 fwq.c/include include include include include include include main()char c,buf1024,file30;int fromlen,source;register int k,s,ns;struct sockaddr_in sin;struct hostent hp;system(clear

13、);printf();printf(输入要传输的文件名:);scanf(s,file);if (source=open(file,O_RDONLY)h_addr, sin.sin_addr,hph_length);if(bind(s,sin,sizeof(sin)0)write(ns,buf,k);printf(传输完毕!);close(ns);close(source);exit(0);/客户机源程序 khj.c/include stdio.hinclude sys/types.hinclude sys/fcntl.hinclude sys/socket.hinclude sys/netin

14、et/in.hinclude netdb.hinclude errno.hinclude string.hmain()char buf1024,file30;char strs=正在接收文件;int target;register int k,s;struct sockaddr_in sin;struct hostent hp;system(clear);printf();hp=gethostbyname(server);if(hp=NULL)perror(返回服务器地址信息错!);exit(1);s=socket(AF_INET,SOCK_STREAM,0);if(sh_addr,sin.sin_addr,hph_length);printf(正在与服务器连接);if(connect(s, sin,sizeof(sin),0)0)write(tatget,buf,k);printf(接收文件成功!);close(s);close(target);上述程序在 Sco Unix System v3.2 及 Sco TCP/IP Rumtime 环境下调试通过。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号