第8章计算机网络应用程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非阻塞方式 在非阻塞方式下,当输入输出条件还没有准备好时,进程 仍处于运行状态,通过循环,反复进行某条件的查询。一 般说来,阻塞机制可以防止进程在循环反复的查询等待中 造成资源浪费。但是有时在应用中需要进程一直处于运行 状态,不希望进程在对socket的操作中阻塞,这时就要使 用非阻塞机制。
8.2 基本Socket函数
函数listen()有两个功能。
(1)主动插口的被动转换 socket()创建的插口都是主动插口,只可以用来(调用connect())进行主动连接(发出 请求),不能接收连接请求。listen()函数将未连接的主动插口转换为被动插口,即倾 听插口(listening socket),告诉操作系统该插口可以接收连接请求。所以listen()也称 为创建倾听插口函数。 (2)设置最大请求连接数 listen()用一个参数(backlog)指定完成队列的最大长度。如果一个客户机的SYN数据 段到达时,倾听插口的完成队列已经满了,TCP则忽略这个SYN数据段。 listen()函数执行成功,返回0,服务器的TCP状态由CLOSED转变成LISTEN,成为被 动模式;执行失败,返回1。
8.1.2 socket编程模型及类型
套接口可分如下5种类型:流式套接字、数据报套接字、 原始套接字、SOCK_SEQPACKET及SOCK_百度文库DM。
流式套接字定义了一种可靠的面向连接的服务,实现了无差错的数据 传输。
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进 行传输,是无序的,并且不保证可靠。
原型
参数: ·sockfd为要转换的已绑定本地地址的插口描述符; ·backlog设置请求队列的最大长度,表示被动(倾听)插口能够接收 的最大数目的未接收连接(相当于窗口通告)。
8.2.4 套接口被动转换listen()
创建TCP服务器倾听插口的过程 (1)首先调用socket()函数创建一个主动插口; (2)调用bind()函数进行插口地址绑定; (3)调用listen()函数进行转换。
第8章计算机网络应用程序设计
8.1 套接口API的有关概念 8.2 基本Socket函数 8.3 基于TCP的socket程序设计 8.4 基于UDP的socket 程序设计 8.5 输入输出多路复用 8.6 并发服务器程序设计
8.1 套接口API的有关概念
8.1.1 网络应用编程接口
Berkeley套接口API WinSock 远程过程调用(RPC)
8.2.5 从被动套接口的完成队列中接受一个连 接请求accept()
功能
一个插口被创建、用bind绑定本地地址并转换成被动模式后,必须接 收一个连接请求。一旦接收了连接,服务器就能使用该连接与客户机 进行通信。面向连接传输协议的服务器调用 accept从被动(倾听)插 口的完成连接队列中接收下一个连接请求。如果该完成连接队列空, 则使这个进程睡眠。 原型
2、原型
8.2.2 本地地址绑定bind() 1、功能
调用函数bind(),可以将本地地址与插口绑定在一起。 调用成功时,返回0;否则,返回1,并设置全局变量 errno为错误类型
2、原型
参数说明 ·sockfd是函数socket返回的插口描述字; ·myaddr是特定于协议的地址结构体的指针,指向本地插口地址; ·addrlen是插口地址结构体的长度。
参数: ·sockfd为服务器已经创建并绑定到指定插口地址的插口描述符; ·addr是指向一个Internet插口地址结构体的指针; ·addrlen是指向一个整型数的指针。
8.2.5 从被动套接口的完成队列中接受 一个连接请求accept()
accept()工作过程
TCP使用侦听插口接收客户机的连接请求。如 果调用accept()时,倾听插口的完成队列中有已经 完成3次握手的TCP连接,accept()就从队列的首部 读取第一个连接,并返回该连接的描述符。如果 调用accept()时,倾听插口的完成队列为空,进程 将阻塞,等待出现新的完成3次握手的TCP连接送 到完成队列;TCP协议为服务器创建一个新的连 接插口来标识这条新的连接,accept()返回该新连 接的描述符。
8.2.1 初始化套接口——服务绑定socket()
1、功能:
在应用程序中使用插口API时,首先要创建一个插口--socket。为 了说明什么是socket,可以打个比方:一个电话插座,既可以接电话 机打电话,也可以接传真机发传真,还可以接计算机上网。接上什么 设备,就是绑定了什么服务。创建一个插口,就是创建一个通信,需 要指定提供什么服务,即为一个标识符绑定某个服务,并为之分配资 源。这个标识就是该插口标识。 应用程序调用socket()函数将创建一个插口。
这两部分合在一起,成为套接口地址(计算机通信的基础 构筑块 )
8.1.4 通信进程的阻塞和非阻塞方式
对于运行状态中的进程来说,当某些条件不具备, 如输入输出条件还没有准备好时,该进程可以有两种处理 方式:阻塞与非阻塞。
阻塞方式 在阻塞方式下,当输入输出条件还没有准备好时,就将进 程转入阻塞状态,标记阻塞原因,并保留当前进程现场信 息,然后将控制转入进程调度程序,等阻塞原因解除后, 将进程状态由阻塞变成就绪等待处理机,或直接获得由调 度程序再次分配的处理机,恢复阻塞的现场继续执行。
8.2.3 建立套接口连接-绑定远程服务器地址connect() 功能
函数connect()可以让客户机程序建立一个与TCP服务器的 连接. 原型
参数: ·sockfd是函数socket返回的插口描述符; ·servaddr指定远程服务器的插口地址; ·addrlen是插口地址结构体的长度。
8.2.4 套接口被动转换listen()
原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络
协议实现的测试等。
Internet的Socket编程模型
8.1.3 socket地址——应用进程的标识
Internet上两台主机种的进程间要进行通信,必须能 够互相识别。用于标识进程的信息有两个:
主机名或主机地址
主机内部标识进程的标识符
8.2 基本Socket函数
函数listen()有两个功能。
(1)主动插口的被动转换 socket()创建的插口都是主动插口,只可以用来(调用connect())进行主动连接(发出 请求),不能接收连接请求。listen()函数将未连接的主动插口转换为被动插口,即倾 听插口(listening socket),告诉操作系统该插口可以接收连接请求。所以listen()也称 为创建倾听插口函数。 (2)设置最大请求连接数 listen()用一个参数(backlog)指定完成队列的最大长度。如果一个客户机的SYN数据 段到达时,倾听插口的完成队列已经满了,TCP则忽略这个SYN数据段。 listen()函数执行成功,返回0,服务器的TCP状态由CLOSED转变成LISTEN,成为被 动模式;执行失败,返回1。
8.1.2 socket编程模型及类型
套接口可分如下5种类型:流式套接字、数据报套接字、 原始套接字、SOCK_SEQPACKET及SOCK_百度文库DM。
流式套接字定义了一种可靠的面向连接的服务,实现了无差错的数据 传输。
数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进 行传输,是无序的,并且不保证可靠。
原型
参数: ·sockfd为要转换的已绑定本地地址的插口描述符; ·backlog设置请求队列的最大长度,表示被动(倾听)插口能够接收 的最大数目的未接收连接(相当于窗口通告)。
8.2.4 套接口被动转换listen()
创建TCP服务器倾听插口的过程 (1)首先调用socket()函数创建一个主动插口; (2)调用bind()函数进行插口地址绑定; (3)调用listen()函数进行转换。
第8章计算机网络应用程序设计
8.1 套接口API的有关概念 8.2 基本Socket函数 8.3 基于TCP的socket程序设计 8.4 基于UDP的socket 程序设计 8.5 输入输出多路复用 8.6 并发服务器程序设计
8.1 套接口API的有关概念
8.1.1 网络应用编程接口
Berkeley套接口API WinSock 远程过程调用(RPC)
8.2.5 从被动套接口的完成队列中接受一个连 接请求accept()
功能
一个插口被创建、用bind绑定本地地址并转换成被动模式后,必须接 收一个连接请求。一旦接收了连接,服务器就能使用该连接与客户机 进行通信。面向连接传输协议的服务器调用 accept从被动(倾听)插 口的完成连接队列中接收下一个连接请求。如果该完成连接队列空, 则使这个进程睡眠。 原型
2、原型
8.2.2 本地地址绑定bind() 1、功能
调用函数bind(),可以将本地地址与插口绑定在一起。 调用成功时,返回0;否则,返回1,并设置全局变量 errno为错误类型
2、原型
参数说明 ·sockfd是函数socket返回的插口描述字; ·myaddr是特定于协议的地址结构体的指针,指向本地插口地址; ·addrlen是插口地址结构体的长度。
参数: ·sockfd为服务器已经创建并绑定到指定插口地址的插口描述符; ·addr是指向一个Internet插口地址结构体的指针; ·addrlen是指向一个整型数的指针。
8.2.5 从被动套接口的完成队列中接受 一个连接请求accept()
accept()工作过程
TCP使用侦听插口接收客户机的连接请求。如 果调用accept()时,倾听插口的完成队列中有已经 完成3次握手的TCP连接,accept()就从队列的首部 读取第一个连接,并返回该连接的描述符。如果 调用accept()时,倾听插口的完成队列为空,进程 将阻塞,等待出现新的完成3次握手的TCP连接送 到完成队列;TCP协议为服务器创建一个新的连 接插口来标识这条新的连接,accept()返回该新连 接的描述符。
8.2.1 初始化套接口——服务绑定socket()
1、功能:
在应用程序中使用插口API时,首先要创建一个插口--socket。为 了说明什么是socket,可以打个比方:一个电话插座,既可以接电话 机打电话,也可以接传真机发传真,还可以接计算机上网。接上什么 设备,就是绑定了什么服务。创建一个插口,就是创建一个通信,需 要指定提供什么服务,即为一个标识符绑定某个服务,并为之分配资 源。这个标识就是该插口标识。 应用程序调用socket()函数将创建一个插口。
这两部分合在一起,成为套接口地址(计算机通信的基础 构筑块 )
8.1.4 通信进程的阻塞和非阻塞方式
对于运行状态中的进程来说,当某些条件不具备, 如输入输出条件还没有准备好时,该进程可以有两种处理 方式:阻塞与非阻塞。
阻塞方式 在阻塞方式下,当输入输出条件还没有准备好时,就将进 程转入阻塞状态,标记阻塞原因,并保留当前进程现场信 息,然后将控制转入进程调度程序,等阻塞原因解除后, 将进程状态由阻塞变成就绪等待处理机,或直接获得由调 度程序再次分配的处理机,恢复阻塞的现场继续执行。
8.2.3 建立套接口连接-绑定远程服务器地址connect() 功能
函数connect()可以让客户机程序建立一个与TCP服务器的 连接. 原型
参数: ·sockfd是函数socket返回的插口描述符; ·servaddr指定远程服务器的插口地址; ·addrlen是插口地址结构体的长度。
8.2.4 套接口被动转换listen()
原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络
协议实现的测试等。
Internet的Socket编程模型
8.1.3 socket地址——应用进程的标识
Internet上两台主机种的进程间要进行通信,必须能 够互相识别。用于标识进程的信息有两个:
主机名或主机地址
主机内部标识进程的标识符