《linux系统编程第8章.ppt》由会员分享,可在线阅读,更多相关《linux系统编程第8章.ppt(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 8 章章网络程序设计网络程序设计本章重点 qSocket的基本概念q如何实现面向连接的TCP编程q如何实现非连接的TUDP编程q复杂网络程序的实现28.1.1 TCP/IP概述概述 qTCP/IP协议叫做传输控制/网际协议,又叫网络通讯协议。qTCP/IP是70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和协议标准,以它为基础组建的INTERNET是目前国际上规模最大的计算机网络,正因为INTERNET的广泛使用,使得TCP/IP成了事实上的标准。q各种协议:38.1.2 TCP/IP模块结构模块结构 qTCP/IP从协议分层模型方面来看,由四个层次组成:网络接口层、网络
2、层、传输层、应用层。48.2.1 socket简介简介qsocket是网络编程的一种接口,它是一种特殊的I/O,用socket函数建立一个Socket连接,此函数返回一个整型的socket描述符,随后进行数据传输。q通常socket分为三种类型:流式socket、数据报socket、原始socket。注意:注意:一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket 是面向客户/服务器模型而设计的。58.2.2 socket套接口简介套接口简介q一个IP地址,一个通讯端口,就能确定一个通讯程序的位置。为此开发人员专门设计了一个套接结构,就是把网络程序中所
3、用到的网络地址和端口信息放在一个结构体中。q一般套接口地址结构都以“sockaddr”开头。socket根据所使用的协议的不同可以分TCP套接口和UDP套接口,又称为流式套接口和数据套接口。UDP是一个无连接协议,TCP是个可靠的端对端协议。传输UDP数据包时,LINUX不知道也不关心它们是否已经安全到达目的地,而传输TCP数据包时,则应先建立连接以保证传输的数据被正确接收。68.2.3 socket套接口的数据结构套接口的数据结构 q两个重要的数据类型:sockadd和sockaddr_in,这两个结构类型都是用来保存socket信息的,如IP地址、通信端口等。78.2.4 TCP编程编程
4、q基于TCP协议的编程,其最主要的特点是建立完连接后,才进行通信。q常用的基于TCP网络编程函数及功能 88.2.4 TCP编程编程q例例8.1:服务器通过socket连接后,向客户端发送字符串“连接上了”。在服务器上显示客户端的IP地址或域名。q程序中的主要语句说明:程序中的主要语句说明:服务端服务端建立建立socket:socket(AF_INET,SOCK_STREAM,0);绑定绑定bind:bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr);建立监听建立监听listen:listen(sockfd,BACKLO
5、G);响应客户请求:响应客户请求:accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size);发送数据send:send(client_fd,连接上了 n,26,0);关闭close:close(client_fd);98.2.4 TCP编程编程客户端:客户端:建立socket:socket(AF_INET,SOCK_STREAM,0);请求连接connect:connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr);接收数据recv:recv(sockfd,buf
6、,MAXDATASIZE,0);关闭close:close(sockfd);108.2.4 TCP编程编程q服务端源程序代码:118.2.4 TCP编程编程q客户端源程序代码:128.2.5 UDP编程编程q基于UDP协议的编程,其最主要的特点是不需要用函数bind把本地IP地址与端口号进行绑定,也能进行通信。q常用的基UDP网络编程函数及功能:138.2.5 UDP编程编程q例例8.2:服务器端接受客户端发送的字符串。客户端将打开liu文件,读取文件中的个字符串,传送给服务器端,当传送给服务端的字符串为”stop”时,终止数据传送并断开连接。148.2.5 UDP编程编程q主要语句说明主要语
7、句说明:服务端:服务端:建立建立socket:socket(AF_INET,SOCK_DGRAM,0)绑定绑定bind:bind(sockfd,(struct sockaddr*)&adr_inet,sizeof(adr_inet);接收数据接收数据recvfrom:recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&adr_clnt,&len);关闭关闭close:close(sockfd);158.2.5 UDP编程编程q客户端:客户端:建立socket:socket(AF_INET,SOCK_STREAM,0);读取liu文件:fop
8、en(liu,r);发送数据sendto:sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&adr_srvr,sizeof(adr_srvr);关闭close:close(sockfd);168.2.5 UDP编程编程q服务端源程序代码:178.2.5 UDP编程编程q客户端源程序代码:188.3 网络高级编程网络高级编程q在socket应用中,有一个很重要的特性,那就是如何处理阻塞,解决I/O多路利用问题。q在数据通信中,当服务器运行函数accept()时,假设没有客户机连接请求到来,那么服务器就一直会停止在accept()语句上,等待客户
9、机连接请求到来,出现这样的情况就称为阻塞。q例例8.3:程序运行当中,在10.5秒判断有没有按回车键,有则返回“输入了”,否则返回“超时”。198.3 网络高级编程网络高级编程q源程序代码:程序通过程序通过select函数在指定函数在指定的时间内唤醒或结束进程,的时间内唤醒或结束进程,是处理阻塞的一种好方法。是处理阻塞的一种好方法。208.3 网络高级编程网络高级编程q例例8.4:编写一个网络聊天程序。218.3 网络高级编程网络高级编程q服务端源程序代码:228.3 网络高级编程网络高级编程q客户端源程序代码:23思考与实验思考与实验1.在Linux系统下编写一个socket程序,要求服务端等待客户的连接请求.一旦有客户连接,服务器端打印出客户端的IP地址和端口,并且向服务器端发送欢迎信息和时间。2.编写一个基于TCP协议的网络通信程序,要求服务器通过socket连接后,并要求输入用户,判断为liu时,才向客户端发送字符串Hello,you are connected!。在服务器上显示客户端的IP地址或域名。3.一个以客户机/服务器模式工作,要求在客户端读取系统文件/etc/passwd内容,传送到服务端,服务器端接受字符串,并在显示器显示出来。24
限制150内