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