《费翔林Linux实验教程全套配套课件 第9章 网络通信编程》由会员分享,可在线阅读,更多相关《费翔林Linux实验教程全套配套课件 第9章 网络通信编程(86页珍藏版)》请在金锄头文库上搜索。
1、第第第第9 9章章 网络通信编程网络通信编程章章 网络通信编程网络通信编程实验目的实验目的实验目的实验目的实验目的实验目的实验目的实验目的?加深对网络编程原理的理解加深对网络编程原理的理解加深对网络编程原理的理解加深对网络编程原理的理解?深入了解客户深入了解客户深入了解客户深入了解客户/ /服务器网络编程的执行流程服务器网络编程的执行流程服务器网络编程的执行流程服务器网络编程的执行流程?学会使用套接字建立客户学会使用套接字建立客户学会使用套接字建立客户学会使用套接字建立客户/ /服务器程序服务器程序服务器程序服务器程序?学会使用套接字建立客户学会使用套接字建立客户学会使用套接字建立客户学会使用
2、套接字建立客户/ /服务器程序服务器程序服务器程序服务器程序2主要内容主要内容主要内容主要内容主要内容主要内容主要内容主要内容?背景知识背景知识背景知识背景知识? ?网间进程通信概念网间进程通信概念网间进程通信概念网间进程通信概念? ?套接字编程套接字编程套接字编程套接字编程?实验内容实验内容实验内容实验内容? ?UDPUDP通信通信通信通信? ?UDPUDP通信通信通信通信? ?基于基于基于基于TCPTCP的客户的客户的客户的客户/ /服务器程序服务器程序服务器程序服务器程序3OSIOSI模型与模型与模型与模型与TCP/IPTCP/IP协议栈协议栈协议栈协议栈OSIOSI模型与模型与模型与模
3、型与TCP/IPTCP/IP协议栈协议栈协议栈协议栈4TCPTCP协议协议协议协议TCPTCP协议协议协议协议?TCPTCP的特点的特点的特点的特点? ?端到端、面向连接、全双工通信端到端、面向连接、全双工通信端到端、面向连接、全双工通信端到端、面向连接、全双工通信? ?流接口、抽象成连续的字节流流接口、抽象成连续的字节流流接口、抽象成连续的字节流流接口、抽象成连续的字节流面向连接的可靠传输面向连接的可靠传输面向连接的可靠传输面向连接的可靠传输?面向连接的可靠传输面向连接的可靠传输面向连接的可靠传输面向连接的可靠传输? ?建立连接建立连接建立连接建立连接正确正确、顺序传送数据顺序传送数据正确正
4、确、顺序传送数据顺序传送数据? ?正确正确、顺序传送数据顺序传送数据正确正确、顺序传送数据顺序传送数据? ?断开连接断开连接断开连接断开连接?处理的问题处理的问题处理的问题处理的问题?处理的问题处理的问题处理的问题处理的问题? ?IPIP数据报的丢失、重复、失序、延迟数据报的丢失、重复、失序、延迟数据报的丢失、重复、失序、延迟数据报的丢失、重复、失序、延迟发送和接收速度的匹配发送和接收速度的匹配发送和接收速度的匹配发送和接收速度的匹配? ?发送和接收速度的匹配发送和接收速度的匹配发送和接收速度的匹配发送和接收速度的匹配? ?系统重启动,一方连接信息丢失系统重启动,一方连接信息丢失系统重启动,一
5、方连接信息丢失系统重启动,一方连接信息丢失? ?网络拥塞网络拥塞网络拥塞网络拥塞5? ?网络拥塞网络拥塞网络拥塞网络拥塞UDPUDP协议协议协议协议UDPUDP协议协议协议协议?无连接无连接无连接无连接? ?不需要在通信前建立连接不需要在通信前建立连接不需要在通信前建立连接不需要在通信前建立连接? ?不使用控制报文不使用控制报文不使用控制报文不使用控制报文传输开销低传输开销低传输开销低传输开销低? ?传输开销低传输开销低传输开销低传输开销低?面向报文面向报文面向报文面向报文不将报文分割不将报文分割,也不合并也不合并不将报文分割不将报文分割,也不合并也不合并? ?不将报文分割不将报文分割,也不合
6、并也不合并不将报文分割不将报文分割,也不合并也不合并? ?UDPUDP报文的大小影响了网络的利用率报文的大小影响了网络的利用率报文的大小影响了网络的利用率报文的大小影响了网络的利用率? ?过小造成报头比率过大过小造成报头比率过大过小造成报头比率过大过小造成报头比率过大? ?过小造成报头比率过大过小造成报头比率过大过小造成报头比率过大过小造成报头比率过大? ?过大造成过大造成过大造成过大造成MTUMTU分片分片分片分片?尽力而为尽力而为尽力而为尽力而为?尽力而为尽力而为尽力而为尽力而为?任意交互任意交互任意交互任意交互一对一一对一、一对多一对多、多对一和多对多多对一和多对多一对一一对一、一对多一
7、对多、多对一和多对多多对一和多对多6? ?一对一一对一、一对多一对多、多对一和多对多多对一和多对多一对一一对一、一对多一对多、多对一和多对多多对一和多对多LinuxLinux的网络分层结构的网络分层结构的网络分层结构的网络分层结构LinuxLinux的网络分层结构的网络分层结构的网络分层结构的网络分层结构网络应用网络应用网络应用网络应用BSD套接字套接字用户数据界面用户数据界面用户数据界面用户数据界面套接字套接字INET套接字套接字接口界面接口界面接口界面接口界面TCPUDP协议分层协议分层协议分层协议分层IPARPPPPSLIPSocketARP网络驱动网络驱动网络驱动网络驱动7网络服务的标
8、识网络服务的标识网络服务的标识网络服务的标识网络服务的标识网络服务的标识网络服务的标识网络服务的标识?TCP/UDPTCP/UDP端口号端口号端口号端口号作为服务器程序标识作为服务器程序标识作为服务器程序标识作为服务器程序标识? ?服务器启动时,首先在本地主机注册自己使用的服务器启动时,首先在本地主机注册自己使用的服务器启动时,首先在本地主机注册自己使用的服务器启动时,首先在本地主机注册自己使用的TCPTCP或或或或UDPUDP端口号端口号端口号端口号? ?客户通过与服务器指定的客户通过与服务器指定的客户通过与服务器指定的客户通过与服务器指定的TCPTCP端口建立连接端口建立连接端口建立连接端
9、口建立连接(或直接向(或直接向服务器指定的服务器指定的(或直接向(或直接向服务器指定的服务器指定的UDPUDP端口发送信息端口发送信息端口发送信息端口发送信息)来访问特定服务)来访问特定服务)来访问特定服务)来访问特定服务运行服务器程序的主机收到信息后运行服务器程序的主机收到信息后,将其转交给注册该将其转交给注册该运行服务器程序的主机收到信息后运行服务器程序的主机收到信息后,将其转交给注册该将其转交给注册该? ?运行服务器程序的主机收到信息后运行服务器程序的主机收到信息后,将其转交给注册该将其转交给注册该运行服务器程序的主机收到信息后运行服务器程序的主机收到信息后,将其转交给注册该将其转交给注
10、册该端口的服务器程序端口的服务器程序处理处理端口的服务器程序端口的服务器程序处理处理网络进程标识方法网络进程标识方法网络进程标识方法网络进程标识方法? ?网络进程标识方法网络进程标识方法网络进程标识方法网络进程标识方法? ?(协议,本地地址,本地端口号)(协议,本地地址,本地端口号)(协议,本地地址,本地端口号)(协议,本地地址,本地端口号)完整网间通信标识方法完整网间通信标识方法完整网间通信标识方法完整网间通信标识方法? ?完整网间通信标识方法完整网间通信标识方法完整网间通信标识方法完整网间通信标识方法? ?协议,本地地址,本地端口号,远地地址,远地端口协议,本地地址,本地端口号,远地地址,
11、远地端口协议,本地地址,本地端口号,远地地址,远地端口协议,本地地址,本地端口号,远地地址,远地端口号号)号号)8号号)号号)网络地址网络地址网络地址网络地址网络地址网络地址网络地址网络地址?通常主机地址由网络通常主机地址由网络通常主机地址由网络通常主机地址由网络IDID和主机和主机和主机和主机IDID组成组成组成组成? ?在在在在TCP/IPTCP/IP协议中用协议中用协议中用协议中用3232位整数值表示位整数值表示位整数值表示位整数值表示? ?TCPTCP和和和和UDPUDP均使用均使用均使用均使用1616位端口号标识用户进程位端口号标识用户进程位端口号标识用户进程位端口号标识用户进程?某
12、一主机可与多个网络相连,必须指定一特定网络某一主机可与多个网络相连,必须指定一特定网络某一主机可与多个网络相连,必须指定一特定网络某一主机可与多个网络相连,必须指定一特定网络地址地址地址地址地址地址地址地址?网络上每一台主机应有其唯一的地址网络上每一台主机应有其唯一的地址网络上每一台主机应有其唯一的地址网络上每一台主机应有其唯一的地址?每主机上的每进程应有在该主机上的唯标识每主机上的每进程应有在该主机上的唯标识每主机上的每进程应有在该主机上的唯标识每主机上的每进程应有在该主机上的唯标识?每每一一主机上的每主机上的每一一进程应有在该主机上的唯进程应有在该主机上的唯一一标识每标识每一一主机上的每主
13、机上的每一一进程应有在该主机上的唯进程应有在该主机上的唯一一标识标识符符符符9协议端口协议端口协议端口协议端口协议端口协议端口协议端口协议端口?端口是一种抽象的软件结构,用于标识通信的进程端口是一种抽象的软件结构,用于标识通信的进程端口是一种抽象的软件结构,用于标识通信的进程端口是一种抽象的软件结构,用于标识通信的进程?客户程序或服务进程使用其发送和接收信息客户程序或服务进程使用其发送和接收信息客户程序或服务进程使用其发送和接收信息客户程序或服务进程使用其发送和接收信息?TCPTCP和和和和UDPUDP的端口号相互独立的端口号相互独立的端口号相互独立的端口号相互独立?TCPTCP和和和和UDP
14、UDP的端口号相互独立的端口号相互独立的端口号相互独立的端口号相互独立?端口号分配端口号分配端口号分配端口号分配全局分配全局分配:由一个公认的中央机构根据用户需要进行统由一个公认的中央机构根据用户需要进行统全局分配全局分配:由一个公认的中央机构根据用户需要进行统由一个公认的中央机构根据用户需要进行统? ?全局分配全局分配:由一个公认的中央机构根据用户需要进行统由一个公认的中央机构根据用户需要进行统全局分配全局分配:由一个公认的中央机构根据用户需要进行统由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众一分配,并将结果公布于众一分配,并将结果公布于众一分配,并将结果公布于众? ?本地
15、分配本地分配:进程需要访问传输层服务时进程需要访问传输层服务时,向本地操作系向本地操作系本地分配本地分配:进程需要访问传输层服务时进程需要访问传输层服务时,向本地操作系向本地操作系? ?本地分配本地分配:进程需要访问传输层服务时进程需要访问传输层服务时,向本地操作系向本地操作系本地分配本地分配:进程需要访问传输层服务时进程需要访问传输层服务时,向本地操作系向本地操作系统提出申请,操作系统返回一个本地唯一的端口号统提出申请,操作系统返回一个本地唯一的端口号统提出申请,操作系统返回一个本地唯一的端口号统提出申请,操作系统返回一个本地唯一的端口号? ?TCP/IPTCP/IP端口号分配方法端口号分配
16、方法:综合上述两种方式综合上述两种方式端口号分配方法端口号分配方法:综合上述两种方式综合上述两种方式? ?TCP/IPTCP/IP端口号分配方法端口号分配方法:综合上述两种方式综合上述两种方式端口号分配方法端口号分配方法:综合上述两种方式综合上述两种方式? ?保留端口(保留端口(保留端口(保留端口(256256):以全局方式分配给服务进程):以全局方式分配给服务进程):以全局方式分配给服务进程):以全局方式分配给服务进程? ?自由端口自由端口:以本地方式进行分配以本地方式进行分配自由端口自由端口:以本地方式进行分配以本地方式进行分配? ?自由端口自由端口:以本地方式进行分配以本地方式进行分配自
17、由端口自由端口:以本地方式进行分配以本地方式进行分配10客户客户客户客户/ /服务器交互模型服务器交互模型服务器交互模型服务器交互模型客户客户客户客户/ /服务器交互模型服务器交互模型服务器交互模型服务器交互模型?服务器程序服务器程序服务器程序服务器程序? ?被动地等待请求并做出响应被动地等待请求并做出响应被动地等待请求并做出响应被动地等待请求并做出响应?客户程序客户程序客户程序客户程序? ?向服务器发出服务请求向服务器发出服务请求向服务器发出服务请求向服务器发出服务请求11客户客户客户客户/ /服务器程序特性对比服务器程序特性对比服务器程序特性对比服务器程序特性对比客户客户客户客户/ /服务
18、器程序特性对比服务器程序特性对比服务器程序特性对比服务器程序特性对比12服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案?系统资源要求不高系统资源要求不高系统资源要求不高系统资源要求不高?在处理一个请求时其他请求必须等待在处理一个请求时其他请求必须等待在处理一个请求时其他请求必须等待在处理一个请求时其他请求必须等待?一一般针对于面向无连接的客户般针对于面向无连接的客户一一般针对于面向无连接
19、的客户般针对于面向无连接的客户/ /服务器模型服务器模型服务器模型服务器模型?般针对于面向无连接的客户般针对于面向无连接的客户般针对于面向无连接的客户般针对于面向无连接的客户/ /服务器模型服务器模型服务器模型服务器模型13服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案并发服务器方案并发服务器方案服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案并发服务器方案并发服务器方案?系统资源要求较高系统资源要求较高系统资源要求较高系统资源要求较高?实时性和灵活性是该方案的最大特点实时性和灵活性是该方
20、案的最大特点实时性和灵活性是该方案的最大特点实时性和灵活性是该方案的最大特点?一一般针对于面向连接的客户般针对于面向连接的客户一一般针对于面向连接的客户般针对于面向连接的客户/ /服务器模型服务器模型服务器模型服务器模型?般针对于面向连接的客户般针对于面向连接的客户般针对于面向连接的客户般针对于面向连接的客户/ /服务器模型服务器模型服务器模型服务器模型14主要内容主要内容主要内容主要内容主要内容主要内容主要内容主要内容?背景知识背景知识背景知识背景知识? ?网间进程通信概念网间进程通信概念网间进程通信概念网间进程通信概念? ?套接字编程套接字编程套接字编程套接字编程?实验内容实验内容实验内容
21、实验内容? ?UDPUDP通信通信通信通信? ?UDPUDP通信通信通信通信? ?基于基于基于基于TCPTCP的客户的客户的客户的客户/ /服务器程序服务器程序服务器程序服务器程序15LinuxLinux的网络分层结构功能说明的网络分层结构功能说明的网络分层结构功能说明的网络分层结构功能说明LinuxLinux的网络分层结构功能说明的网络分层结构功能说明的网络分层结构功能说明的网络分层结构功能说明?套接字套接字套接字套接字(Socket)(Socket)接口接口接口接口? ?SocketSocket接口是应用程序同接口是应用程序同接口是应用程序同接口是应用程序同TCP/IPTCP/IP协议栈的
22、接口协议栈的接口协议栈的接口协议栈的接口? ?源自加州大学源自加州大学源自加州大学源自加州大学BerkeleyBerkeley分校的分校的分校的分校的BSD UNIXBSD UNIX? ?很多语法特性源自很多语法特性源自很多语法特性源自很多语法特性源自UNIXUNIX? ?SocketSocket并不是并不是并不是并不是TCP/IPTCP/IP标准的组成部分标准的组成部分标准的组成部分标准的组成部分? ?目前已成为事实上的工业标准目前已成为事实上的工业标准目前已成为事实上的工业标准目前已成为事实上的工业标准? ?UNIXUNIX系列系统提供系列系统提供系列系统提供系列系统提供SocketSoc
23、ket? ?WindowsWindows系列、系列、系列、系列、MacintoshMacintosh系列、系列、系列、系列、SolarisSolaris等亦提供等亦提供等亦提供等亦提供16TCP/IPTCP/IP网络套接字网络套接字网络套接字网络套接字TCP/IPTCP/IP网络套接字网络套接字网络套接字网络套接字应用层应用层套接字层套接字层流套接字流套接字数据报套接字数据报套接字流套接字流套接字数据报套接字数据报套接字TCP UDP层层IP层层网络层网络层17socketsocket基本概念基本概念基本概念基本概念socketsocket基本概念基本概念基本概念基本概念? TCP/IPTCP
24、/IP网络的网络的网络的网络的APIAPI定义一组函数定义一组函数定义一组函数定义一组函数/ /例程例程,支持支持例程例程,支持支持TCP/IPTCP/IP网络应用程序开发网络应用程序开发网络应用程序开发网络应用程序开发? ?定义一组函数定义一组函数定义一组函数定义一组函数/ /例程例程,支持支持例程例程,支持支持TCP/IPTCP/IP网络应用程序开发网络应用程序开发网络应用程序开发网络应用程序开发? 一种文件描述符一种文件描述符一种文件描述符一种文件描述符SocketSocket? ?数据传输是一种特殊的数据传输是一种特殊的数据传输是一种特殊的数据传输是一种特殊的I/OI/O数据传输是一种
25、特殊的数据传输是一种特殊的数据传输是一种特殊的数据传输是一种特殊的? ?与数据通信相关的系统调用是与数据通信相关的系统调用是与数据通信相关的系统调用是与数据通信相关的系统调用是read()/write()read()/write()? 基于基于基于基于socketsocket的端到端通信的端到端通信的端到端通信的端到端通信? ?形式形式形式形式? ?形式形式形式形式? ?(IP, PORT)(IP, PORT)? ?网络进程标识网络进程标识网络进程标识网络进程标识协议协议协议协议 本地地址本地地址本地地址本地地址 本地端本地端本地端本地端? ? ? ?网间通信标识网间通信标识网间通信标识网间通
26、信标识? ? 端口分类端口分类端口分类端口分类? ?端口分类端口分类端口分类端口分类? ?公认端口:小于公认端口:小于公认端口:小于公认端口:小于256256的端口才能作为保留端口的端口才能作为保留端口的端口才能作为保留端口的端口才能作为保留端口? ?注册端口注册端口注册端口注册端口18? ?动态和动态和动态和动态和/ /或私有端口或私有端口或私有端口或私有端口socketsocket基本功能基本功能基本功能基本功能socketsocket基本功能基本功能基本功能基本功能?支持多种协议族支持多种协议族支持多种协议族支持多种协议族?面向连接的服务和无连接的服务面向连接的服务和无连接的服务面向连接
27、的服务和无连接的服务面向连接的服务和无连接的服务?地址的表示地址的表示地址的表示地址的表示( (数据结构数据结构数据结构数据结构) )?地址的表示地址的表示地址的表示地址的表示( (数据结构数据结构数据结构数据结构) )?主机字节顺序和网络字节顺序主机字节顺序和网络字节顺序主机字节顺序和网络字节顺序主机字节顺序和网络字节顺序19基本基本基本基本socket APIsocket API基本基本基本基本socket APIsocket API?socket()socket()创建一个新的创建一个新的创建一个新的创建一个新的SocketSocket?close() close() 关闭一个关闭一个关
28、闭一个关闭一个SocketSocket?bind()bind() 将服务器将服务器将服务器将服务器(IP Port)(IP Port)赋予赋予赋予赋予SocketSocket?bind() bind() 将服务器将服务器将服务器将服务器(IP, Port)(IP, Port)赋予赋予赋予赋予SocketSocket?listen() listen() 等待到来的客户连接请求(等待到来的客户连接请求(等待到来的客户连接请求(等待到来的客户连接请求(TCPTCP)?() ()接受客户连接请求并建立连接接受客户连接请求并建立连接(接受客户连接请求并建立连接接受客户连接请求并建立连接(TCPTCP)?
29、accept() accept() 接受客户连接请求并建立连接接受客户连接请求并建立连接(接受客户连接请求并建立连接接受客户连接请求并建立连接(TCPTCP)?connect() connect() 向服务器发出连接请求向服务器发出连接请求向服务器发出连接请求向服务器发出连接请求?send() send() 发送数据发送数据发送数据发送数据?recv()recv() 接收数据接收数据接收数据接收数据?recv() recv() 接收数据接收数据接收数据接收数据20套接字类型套接字类型套接字类型套接字类型套接字类型套接字类型套接字类型套接字类型?流套接字流套接字流套接字流套接字(SOCK_STR
30、EAM)(SOCK_STREAM)? ?可靠的、面向连接的通信可靠的、面向连接的通信可靠的、面向连接的通信可靠的、面向连接的通信? ?使用使用使用使用TCPTCP协议协议协议协议?数据报套接字数据报套接字数据报套接字数据报套接字(SOCK_DGRAM)(SOCK_DGRAM)? ?无连接服务无连接服务无连接服务无连接服务? ?无连接服务无连接服务无连接服务无连接服务? ?使用使用使用使用UDPUDP协议协议协议协议?原始套接字原始套接字原始套接字原始套接字(SOCK RAW)(SOCK RAW)?原始套接字原始套接字原始套接字原始套接字(SOCK_RAW)(SOCK_RAW)? ?允许对底层协
31、议如允许对底层协议如允许对底层协议如允许对底层协议如IPIP、ICMPICMP直接访问直接访问直接访问直接访问21sockaddrsockaddr结构定义结构定义结构定义结构定义sockaddrsockaddr结构定义结构定义结构定义结构定义?功能功能功能功能? ?保存保存保存保存socketsocket信息信息信息信息?结构结构结构结构structstruct sockaddrsockaddr unsigned short unsigned short sa_familysa_family; /* ; /* 地址族,地址族,地址族,地址族,AF_xxxAF_xxx */ */ char ch
32、ar sa_datasa_data14; /* 14; /* 协议地址协议地址协议地址协议地址 * */ / ; ; ?说明说明说明说明说明说明说明说明? ?sa_familysa_family一般为一般为一般为一般为AF_INETAF_INET(表示(表示(表示(表示TCP/IPTCP/IP)? ?sa datasa data包含包含包含包含socketsocket的的的的IPIP地址和端口号地址和端口号地址和端口号地址和端口号22? ?sa_datasa_data包含包含包含包含socketsocket的的的的IPIP地址和端口号地址和端口号地址和端口号地址和端口号? ?/include/
33、include/linuxlinux/ /socket.hsocket.hsockaddr insockaddr in结构定义结构定义结构定义结构定义sockaddr_insockaddr_in结构定义结构定义结构定义结构定义? 功能功能功能功能k ddk dd 的另一种表示形式的另一种表示形式的另一种表示形式的另一种表示形式? ?sockaddrsockaddr的另一种表示形式的另一种表示形式的另一种表示形式的另一种表示形式? 结构结构结构结构struct sockaddr in struct sockaddr in struct in_addrstruct in_addr_u32 s_ad
34、dr;_u32 s_addr; ;struct sockaddr_in struct sockaddr_in short int short int sin_familysin_family; /* ; /* 地址族地址族地址族地址族 * */ / unsigned short int sin_port; /* unsigned short int sin_port; /* 端口号端口号端口号端口号 * */ / struct struct in addrin addr sin addr; /* IPsin addr; /* IP地址地址地址地址 * */ / ; ;st uctst uct_
35、add_add s_add ;/s_add ;/地址地址地址地址 / /unsigned char sin_zero8; /* unsigned char sin_zero8; /* 填充填充填充填充0 0 以保持与以保持与以保持与以保持与struct sockaddrstruct sockaddr同样大同样大小小同样大同样大小小 * */ / ; ; ; ; ? 说明说明说明说明? ?sin_zerosin_zero用于将用于将用于将用于将sockaddr_insockaddr_in结构填充到与结构填充到与结构填充到与结构填充到与struct sockaddrstruct sockaddr等
36、长,可用等长,可用等长,可用等长,可用或或或或函数将其置为函数将其置为函数将其置为函数将其置为bzero( )bzero( )或或或或memset( )memset( )函数将其置为函数将其置为函数将其置为函数将其置为0 0 ? ?当当当当sin_port = 0sin_port = 0时,系统随机选择一个未被使用的端口号时,系统随机选择一个未被使用的端口号时,系统随机选择一个未被使用的端口号时,系统随机选择一个未被使用的端口号? ?当当当当s addr = s addr = INADDR ANYINADDR ANY时时,表示填入本机表示填入本机时时,表示填入本机表示填入本机IPIP地址地址地
37、址地址23当当当当 _ _ _时时,表示填入本机表示填入本机时时,表示填入本机表示填入本机地址地址地址地址? ?指向指向指向指向sockaddr_insockaddr_in的指针和指向的指针和指向的指针和指向的指针和指向sockaddrsockaddr的指针可以相互转换的指针可以相互转换的指针可以相互转换的指针可以相互转换LinuxLinux支持的协议和地址族支持的协议和地址族支持的协议和地址族支持的协议和地址族LinuxLinux支持的协议和地址族支持的协议和地址族支持的协议和地址族支持的协议和地址族地址地址协议协议协议描述协议描述地址地址协议协议协议描述协议描述AF_UNIXAF_UNIX
38、PF_UNIXPF_UNIXUnixUnix域域域域AF_INETAF_INETPF_INETPF_INETTCP/IPTCP/IP(V4V4)AF INET6AF INET6PF INET6PF INET6TCP/IPTCP/IP(V6V6)AF_INET6AF_INET6PF_INET6PF_INET6TCP/IPTCP/IP(V6V6)AF_AX25AF_AX25PF_AX25PF_AX25业余无线电使用的业余无线电使用的业余无线电使用的业余无线电使用的AX.25AX.25AF IPXAF IPXPF IPXPF IPXNllNll的的的的IPXIPXAF_IPXAF_IPXPF_IPX
39、PF_IPXNovellNovell的的的的IPXIPXAF_APPLETALKAF_APPLETALKPF_APPLETALKPF_APPLETALKAppleTalk DDSAppleTalk DDSAF_NETROMAF_NETROMPF_NETROMPF_NETROM业余无线电使用的业余无线电使用的业余无线电使用的业余无线电使用的 NetRomNetRom24字节顺序字节顺序字节顺序字节顺序字节顺序字节顺序字节顺序字节顺序?主机字节顺序主机字节顺序主机字节顺序主机字节顺序(HBOHBO,Host Byte OrderHost Byte Order)? ?不同的机器不同的机器不同的机器不
40、同的机器HBOHBO不相同,与不相同,与不相同,与不相同,与CPUCPU设计有关设计有关设计有关设计有关? ?Motorola 68kMotorola 68k系列,系列,系列,系列,HBOHBO与与与与NBONBO相同相同相同相同? ?Intel x86Intel x86系列,系列,系列,系列,HBOHBO与与与与NBONBO相反相反相反相反?网络字节顺序网络字节顺序网络字节顺序网络字节顺序(NBONBO,Network Byte OrderNetwork Byte Order)?网络字节顺序网络字节顺序网络字节顺序网络字节顺序(NBONBO,Network Byte OrderNetwork
41、 Byte Order)? ?使用统一的字节顺序,避免兼容性问题使用统一的字节顺序,避免兼容性问题使用统一的字节顺序,避免兼容性问题使用统一的字节顺序,避免兼容性问题25字节顺序转换函数字节顺序转换函数字节顺序转换函数字节顺序转换函数字节顺序转换函数字节顺序转换函数字节顺序转换函数字节顺序转换函数? 头文件头文件头文件头文件#il d#il dtittit/ /ihih? ?#include #include ? 函数原型函数原型函数原型函数原型? ?uint32 tuint32 t htonlhtonl(uint32 t(uint32 t hostlonghostlong); );? ?ui
42、nt32_t uint32_t htonlhtonl(uint32_t (uint32_t hostlonghostlong); );? ?把把把把3232位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序? ?uint16 t uint16 t htonshtons(uint16 t (uint16 t hostshorthostshort); );_ _(_(_); );? ?把把把把1616位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序位值从主机字节序转换成网络字节序位值从主机字节序转换成网络
43、字节序? ?uint32_t uint32_t ntohlntohl(uint32_t (uint32_t hostlonghostlong); );? ?把把把把3232位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序? ?uint16_t uint16_t ntohsntohs(uint16_t (uint16_t hostshorthostshort); );? ?把把把把1616位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序?
44、 ?把把把把1616位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序位值从网络字节序转换成主机字节序? 说明说明说明说明? ?h h 代表代表代表代表host, nhost, n 代表代表代表代表 networknetwork26? ?h h 代表代表代表代表host, n host, n 代表代表代表代表 networknetwork? ?s s 代表代表代表代表shortshort,l l 代表代表代表代表long long socket()socket()函数函数函数函数socket()socket()函数函数函数函数? 功能功能功能功能?
45、 ?创建一个套接字创建一个套接字创建一个套接字创建一个套接字? ?#include #include ? 函数原型函数原型函数原型函数原型? 函数原型函数原型函数原型函数原型? ?int socket(int domain, int type, int protocol);int socket(int domain, int type, int protocol);? 参数说明参数说明参数说明参数说明? 参数说明参数说明参数说明参数说明? ?domaindomain:应用程序所在主机使用的通信协议族,即:应用程序所在主机使用的通信协议族,即:应用程序所在主机使用的通信协议族,即:应用程序所在主
46、机使用的通信协议族,即地址族地址族地址族地址族? ?typetype:套接字类型套接字类型,可选流式可选流式、数据报式或原始式套接字数据报式或原始式套接字:套接字类型套接字类型,可选流式可选流式、数据报式或原始式套接字数据报式或原始式套接字ypyp :套接字类型套接字类型,可选流式可选流式、数据报式或原始式套接字数据报式或原始式套接字:套接字类型套接字类型,可选流式可选流式、数据报式或原始式套接字数据报式或原始式套接字? ?protocolprotocol:使用的特定协议,通常设置为:使用的特定协议,通常设置为:使用的特定协议,通常设置为:使用的特定协议,通常设置为0 0 ,让内核根据指定的类
47、型,让内核根据指定的类型和协议族使用默认的协议和协议族使用默认的协议,让内核根据指定的类型,让内核根据指定的类型和协议族使用默认的协议和协议族使用默认的协议返回值返回值返回值返回值? 返回值返回值返回值返回值? ?成功时,返回一个大于等于成功时,返回一个大于等于成功时,返回一个大于等于成功时,返回一个大于等于0 0的文件描述符的文件描述符的文件描述符的文件描述符? ?失败时失败时,返回一个小于返回一个小于失败时失败时,返回一个小于返回一个小于0 0的值的值的值的值27? ?失败时失败时,返回一个小于返回一个小于失败时失败时,返回一个小于返回一个小于0 0的值的值的值的值socket()sock
48、et()函数函数函数函数socket()socket()函数函数函数函数?代码框架代码框架代码框架代码框架int main()() int sockfd; ;if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(“socket”);exit(1); 28套接字选项套接字选项套接字选项套接字选项套接字选项套接字选项套接字选项套接字选项? 函数原型函数原型函数原型函数原型? ?intint getsockopt(intgetsockopt(int sockfd, intsockfd, int level, intlevel, int o
49、ptname, voidoptname, void *optval, *optval, socklen_tsocklen_t *optlen)*optlen)? ?intint setsockopt(intsetsockopt(int sockfd, intsockfd, int level, intlevel, int optname, constoptname, const voidvoid *optval,*optval,? ?intint setsockopt(intsetsockopt(int sockfd, intsockfd, int level, intlevel, int o
50、ptname, constoptname, const voidvoid optval, optval, socklen_tsocklen_t *optlen)*optlen)? 功能功能功能功能? ?控制套接字行为,如修改缓冲区的大小、传输方式等控制套接字行为,如修改缓冲区的大小、传输方式等控制套接字行为,如修改缓冲区的大小、传输方式等控制套接字行为,如修改缓冲区的大小、传输方式等? 参数说明参数说明参数说明参数说明? ?levellevel:指定控制套接字的层次:指定控制套接字的层次:指定控制套接字的层次:指定控制套接字的层次? ?SOL_SOCKETSOL_SOCKET:通用套接字选项:
51、通用套接字选项:通用套接字选项:通用套接字选项? ?IPPROTO IPIPPROTO IPIPIP选项选项选项选项? ?IPPROTO_IPIPPROTO_IP:IPIP选项选项选项选项? ?IPPROTO_TCPIPPROTO_TCP:TCPTCP选项选项选项选项? ?optnameoptname:指定控制的方式指定控制的方式:指定控制的方式指定控制的方式( (选项的名称选项的名称选项的名称选项的名称) )29p p:指定控制的方式指定控制的方式:指定控制的方式指定控制的方式( (选项的名称选项的名称选项的名称选项的名称) )? ?optvaloptval:获得:获得:获得:获得/ /设置
52、套接字选项设置套接字选项设置套接字选项设置套接字选项SOL SOCKETSOL SOCKET参数选项参数选项参数选项参数选项SOL_SOCKETSOL_SOCKET参数选项参数选项参数选项参数选项SO BROADCASTSO BROADCAST允许发送广播数据允许发送广播数据允许发送广播数据允许发送广播数据intintSO_BROADCASTSO_BROADCAST允许发送广播数据允许发送广播数据允许发送广播数据允许发送广播数据int int SO_DEBUGSO_DEBUG允许调试允许调试允许调试允许调试int int SO_DONTROUTESO_DONTROUTE不查找路由不查找路由不查
53、找路由不查找路由int int SO ERRORSO ERROR获得套接字错误获得套接字错误获得套接字错误获得套接字错误intintSO_ERRORSO_ERROR获得套接字错误获得套接字错误获得套接字错误获得套接字错误int int SO_KEEPALIVESO_KEEPALIVE保持连接保持连接保持连接保持连接int int SO_LINGERSO_LINGER延迟关闭连接延迟关闭连接延迟关闭连接延迟关闭连接structstruct linger linger SO OOBINLINESO OOBINLINE带外数据放入正常数据流带外数据放入正常数据流带外数据放入正常数据流带外数据放入正常
54、数据流int int _ _SO_RCVBUFSO_RCVBUF接收缓冲区大小接收缓冲区大小接收缓冲区大小接收缓冲区大小int int SO_SNDBUFSO_SNDBUF发送缓冲区大小发送缓冲区大小发送缓冲区大小发送缓冲区大小int int SO_RCVLOWATSO_RCVLOWAT接收缓冲区下限接收缓冲区下限接收缓冲区下限接收缓冲区下限int int SO_SNDLOWATSO_SNDLOWAT发送缓冲区下限发送缓冲区下限发送缓冲区下限发送缓冲区下限int int SO_RCVTIMEOSO_RCVTIMEO接收超时接收超时接收超时接收超时structstruct timeval tim
55、eval SO_SNDTIMEOSO_SNDTIMEO发送超时发送超时发送超时发送超时structstruct timeval timeval 允许重用本地地址和端允许重用本地地址和端允许重用本地地址和端允许重用本地地址和端SO_REUSERADDRSO_REUSERADDR允许重用本地地址和端允许重用本地地址和端口口允许重用本地地址和端允许重用本地地址和端口口int int SO_TYPESO_TYPE获得套接字类型获得套接字类型获得套接字类型获得套接字类型int int SO_BSDCOMPATSO_BSDCOMPAT与与与与BSDBSD系统兼容系统兼容系统兼容系统兼容int int 30
56、IPPROTO IPIPPROTO IP与与与与IPPRO TCPIPPRO TCP参数选项参数选项参数选项参数选项IPPROTO_IPIPPROTO_IP与与与与IPPRO_TCPIPPRO_TCP参数选项参数选项参数选项参数选项? IPPROTO_IPIPPROTO_IP? ?IP_HDRINCLIP_HDRINCL? ?在数据包中包含在数据包中包含在数据包中包含在数据包中包含IPIP首部首部首部首部? ?IP OPTINOSIP OPTINOS? ?IP_OPTINOSIP_OPTINOS? ?IPIP首部选项首部选项首部选项首部选项? ?IP TOSIP TOS_ _? ?服务类型服务
57、类型服务类型服务类型? ?IP_TTLIP_TTL? ?生存时间生存时间生存时间生存时间? IPPRO_TCP IPPRO_TCP TCP MAXSEGTCP MAXSEG? ?TCP_MAXSEGTCP_MAXSEG? ?TCPTCP最大数据段的大小最大数据段的大小最大数据段的大小最大数据段的大小? ?TCP NODELAYTCP NODELAY31? ?TCP_NODELAYTCP_NODELAY? ?不使用不使用不使用不使用NagleNagle算法算法算法算法套接字选项示例套接字选项示例套接字选项示例套接字选项示例套接字选项示例套接字选项示例套接字选项示例套接字选项示例?更改发送更改发送
58、更改发送更改发送/ /接收缓冲区大小接收缓冲区大小接收缓冲区大小接收缓冲区大小? ?接收缓冲区接收缓冲区接收缓冲区接收缓冲区int nRecvBuf=32*1024;int nRecvBuf=32*1024;/ /设置为设置为设置为设置为32K32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);char*)&nRecvBuf,sizeof(int);发送缓冲区发送缓冲区发送缓冲区发送缓冲区? ?发送缓冲区发送缓冲区发送缓冲
59、区发送缓冲区int nSendBuf=32*1024;/int nSendBuf=32*1024;/设置为设置为设置为设置为32K32Ktkt( SOL SOCKET SO SNDBUF (ttkt( SOL SOCKET SO SNDBUF (tsetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int); char*)&nSendBuf,sizeof(int); ? ?说明说明说明说明? ?说明说明说明说明? ?对于客户,对于客户,对
60、于客户,对于客户,SO_RCVBUFSO_RCVBUF选项必须在选项必须在选项必须在选项必须在connectconnect之前设置之前设置之前设置之前设置? ?对于服务器对于服务器对于服务器对于服务器SO RCVBUFSO RCVBUF选项必须在选项必须在选项必须在选项必须在listenlisten前设置前设置前设置前设置32? ?对于服务器对于服务器,对于服务器对于服务器,SO_RCVBUFSO_RCVBUF选项必须在选项必须在选项必须在选项必须在listenlisten前设置前设置前设置前设置bind()bind()函数函数函数函数bind()bind()函数函数函数函数? 功能功能功能功
61、能? ?将将将将套接字地址套接字地址套接字地址套接字地址与所创建的套接字号联系起来与所创建的套接字号联系起来与所创建的套接字号联系起来与所创建的套接字号联系起来? ?#include #include ? 函数原型函数原型函数原型函数原型? 函数原型函数原型函数原型函数原型? ?int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);? 参数说明参数说明参数说明参数说明? 参数说明参数说明
62、参数说明参数说明? ?sockfd sockfd :调用:调用:调用:调用socketsocket返回的文件描述符返回的文件描述符返回的文件描述符返回的文件描述符? ?my addr my addr :指向指向:指向指向struct sockaddr struct sockaddr 的指针的指针,保存地址保存地址的指针的指针,保存地址保存地址( (即端口和即端口和即端口和即端口和 IP IP 地地地地y_y_:指向指向:指向指向的指针的指针,保存地址保存地址的指针的指针,保存地址保存地址( (即端口和即端口和即端口和即端口和地地地地址址址址) ) 信息信息信息信息? ?addrlen addr
63、len :设置为:设置为:设置为:设置为 sizeof(struct sockaddr)sizeof(struct sockaddr)返回值返回值返回值返回值? 返回值返回值返回值返回值? ?成功时,返回成功时,返回成功时,返回成功时,返回0 0? ?失败时失败时,返回返回失败时失败时,返回返回 1 133? ?失败时失败时,返回返回失败时失败时,返回返回- -1 1bind()bind()函数函数函数函数bind()bind()函数函数函数函数int main() int sockfd;struct sockaddr_in my_addr; /* 本机地址信息本机地址信息 */if (bin
64、d(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) = -1) perror(“bind”); exit(1); 34connect()connect()函数函数函数函数connect()connect()函数函数函数函数? 功能功能功能功能? ?建立套接字连接建立套接字连接建立套接字连接建立套接字连接? ?#include #include ? 函数原型函数原型函数原型函数原型? 函数原型函数原型函数原型函数原型? ?int connect(int sockfd, const struct sockaddr *serv
65、_addr, socklen_t int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);addrlen); ); );? 参数说明参数说明参数说明参数说明? ?sockfdsockfd:调用:调用:调用:调用socketsocket返回的文件描述符返回的文件描述符返回的文件描述符返回的文件描述符? ?serv_addrserv_addr:保存着:保存着:保存着:保存着目的地目的地目的地目的地端口和端口和端口和端口和 IP IP 地址的数据结构地址的数据结构地址的数据结构地址的数据结构struct
66、 sockaddrstruct sockaddr? ?addrlenaddrlen:设置为:设置为:设置为:设置为 sizeof(struct sockaddr)sizeof(struct sockaddr)返回值返回值返回值返回值? 返回值返回值返回值返回值? ?成功时,返回成功时,返回成功时,返回成功时,返回0 0? ?失败时失败时,返回返回失败时失败时,返回返回 1 135? ?失败时失败时,返回返回失败时失败时,返回返回- -1 1connect()connect()函数函数函数函数connect()connect()函数函数函数函数int main()()int sockfd;str
67、uct sockaddr in serv addr;/* 服务器地址信息服务器地址信息 */struct sockaddr_in serv_addr;/ 服务器地址信息服务器地址信息 /if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr) = -1) perror(“connect”); exit(1); 36 listen()listen()函数函数函数函数listen()listen()函数函数函数函数?功能功能功能功能? ?用于面向连接服务器,表明它愿意接收连接用于面向连接服务器,表明它愿意接
68、收连接用于面向连接服务器,表明它愿意接收连接用于面向连接服务器,表明它愿意接收连接? ?#include #include 函数原型函数原型函数原型函数原型?函数原型函数原型函数原型函数原型? ?int listen(int s, int backlog);int listen(int s, int backlog);参数说参数说参数说参数说?参数说参数说明明参数说参数说明明? ?sockfdsockfd:调用:调用:调用:调用socketsocket返回的文件描述符返回的文件描述符返回的文件描述符返回的文件描述符:在进入队列中允许的连接数目在进入队列中允许的连接数目,在发生错误的在发生错误的
69、:在进入队列中允许的连接数目在进入队列中允许的连接数目,在发生错误的在发生错误的? ?backlogbacklog:在进入队列中允许的连接数目在进入队列中允许的连接数目,在发生错误的在发生错误的:在进入队列中允许的连接数目在进入队列中允许的连接数目,在发生错误的在发生错误的时候返回时候返回时候返回时候返回- -1 1?返回值返回值返回值返回值?返回值返回值返回值返回值? ?成功时,返回成功时,返回成功时,返回成功时,返回0 0? ?失败时失败时,返回返回失败时失败时,返回返回 1 137? ?失败时失败时,返回返回失败时失败时,返回返回- -1 1listen()listen()函数函数函数函
70、数listen()listen()函数函数函数函数int main() int sockfd;if (listen(sockfd, BACKLOG) = -1) perror(listen); exit(1); 38accept()accept()函数函数函数函数accept()accept()函数函数函数函数?功能功能功能功能? ?建立套接字连接建立套接字连接建立套接字连接建立套接字连接? ?#include #include 函数原型函数原型函数原型函数原型?函数原型函数原型函数原型函数原型? ?int accept(int s, struct sockaddr *addr, sockle
71、n_t int accept(int s, struct sockaddr *addr, socklen_t * dd l)* dd l)*addrlen);*addrlen);?参数说明参数说明参数说明参数说明kfdkfd:调用调用:调用调用k tk t返回的文件描述符返回的文件描述符返回的文件描述符返回的文件描述符? ?sockfdsockfd:调用调用:调用调用socketsocket返回的文件描述符返回的文件描述符返回的文件描述符返回的文件描述符? ?addraddr:指向局部的数据结构:指向局部的数据结构:指向局部的数据结构:指向局部的数据结构sockaddr_insockaddr_
72、in的指针的指针的指针的指针? ?addrlenaddrlen:设置为设置为:设置为设置为sizeof(struct sockaddr in)sizeof(struct sockaddr in)? ?addrlenaddrlen:设置为设置为:设置为设置为sizeof(struct sockaddr_in)sizeof(struct sockaddr_in)?返回值返回值返回值返回值? ?成功时成功时,返回一个返回一个成功时成功时,返回一个返回一个socketsocket 端口端口端口端口39? ?成功时成功时,返回一个返回一个成功时成功时,返回一个返回一个socket socket 端口端口
73、端口端口? ?失败时,返回失败时,返回失败时,返回失败时,返回- -1 1accept()accept()函数函数函数函数accept()accept()函数函数函数函数int main() int sockfd client fd;int sockfd, client_fd;struct sockaddr_inremote_addr;/* 客户端地址信息客户端地址信息 */while(1) sin_size = sizeof(struct sockaddr_in); if (client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,
74、 &sin_size) = -1) perror(accept); continue; p(p); printf(from %sn, inet_ntoa(remote_addr.sin_addr); 40write()write()函数函数函数函数write()write()函数函数函数函数?函数原型函数原型函数原型函数原型? ?ssize_tssize_t write(intwrite(int fd,constfd,const voidvoid *buf,size_t*buf,size_t nbytes) nbytes) ?功能功能功能功能? ?将将将将bufbuf中的中的中的中的nbyte
75、snbytes字节内容写入文件描述符字节内容写入文件描述符字节内容写入文件描述符字节内容写入文件描述符fdfd?返回值返回值返回值返回值? ?成功时返回写的字节数成功时返回写的字节数成功时返回写的字节数成功时返回写的字节数? ?失败时返回失败时返回失败时返回失败时返回- -1 1,并设置,并设置,并设置,并设置errnoerrno变量变量变量变量?说明说明说明说明? ?writewrite的返回值大于的返回值大于的返回值大于的返回值大于0 0,表示写了部分或者是全部的数据,表示写了部分或者是全部的数据,表示写了部分或者是全部的数据,表示写了部分或者是全部的数据返回的值小于返回的值小于返回的值小
76、于返回的值小于 ,表示出现错误表示出现错误,表示出现错误表示出现错误? ?返回的值小于返回的值小于返回的值小于返回的值小于0 0,表示出现错误表示出现错误,表示出现错误表示出现错误? ?如果错误为如果错误为如果错误为如果错误为EINTR EINTR ,表示在写的时候出现中断错误,表示在写的时候出现中断错误,表示在写的时候出现中断错误,表示在写的时候出现中断错误如果为如果为如果为如果为EPIPEEPIPE表络连接出现问题表络连接出现问题表络连接出现问题表络连接出现问题41? ?如果为如果为如果为如果为EPIPEEPIPE,表表示网示网络连接出现问题络连接出现问题,表表示网示网络连接出现问题络连接
77、出现问题基于基于基于基于write()write()函数的函数的函数的函数的socketsocket写实现写实现写实现写实现基于基于基于基于write()write()函数的函数的函数的函数的socketsocket写实现写实现写实现写实现42read()read()函数函数函数函数read()read()函数函数函数函数?函数原型函数原型函数原型函数原型? ?ssize_tssize_t read(intread(int fd,voidfd,void *buf,size_t*buf,size_t nbyte)nbyte)?功能功能功能功能功能功能功能功能? ?从从从从fdfd中读取内容中读取
78、内容中读取内容中读取内容?返回值返回值返回值返回值?返回值返回值返回值返回值? ?读成功时,返回实际所读的字节数读成功时,返回实际所读的字节数读成功时,返回实际所读的字节数读成功时,返回实际所读的字节数? ?如果返回的值是如果返回的值是如果返回的值是如果返回的值是0 0 表示已经读到文件的结束表示已经读到文件的结束表示已经读到文件的结束表示已经读到文件的结束? ?如果返回的值是如果返回的值是如果返回的值是如果返回的值是0 0 表示已经读到文件的结束表示已经读到文件的结束表示已经读到文件的结束表示已经读到文件的结束, ,? ?出错时,返回值小于出错时,返回值小于出错时,返回值小于出错时,返回值小
79、于0 0? ?如果错误为如果错误为如果错误为如果错误为EINTREINTR说明读是由中断引起的说明读是由中断引起的说明读是由中断引起的说明读是由中断引起的? ?如果错误为如果错误为如果错误为如果错误为EINTREINTR,说明读是由中断引起的说明读是由中断引起的,说明读是由中断引起的说明读是由中断引起的? ?如果是如果是如果是如果是ECONNRESTECONNREST表示网络连接出了问题表示网络连接出了问题表示网络连接出了问题表示网络连接出了问题43基于基于基于基于read()read()函数的函数的函数的函数的socketsocket读实现读实现读实现读实现基于基于基于基于read()rea
80、d()函数的函数的函数的函数的socketsocket读实现读实现读实现读实现44send()send()函数函数函数函数send()send()函数函数函数函数? 功能功能功能功能用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯? ?用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯用于流式套接字或者数据报套接字的通讯? ?#include sys/#include ? ?#include sys/#include ? ?#include
81、sys/#include sys/socket.hsocket.h? 函数原型函数原型函数原型函数原型? ?ssize tssize t send(send(intint sockfdsockfd, const void *, const void *bufbuf, , size tsize t lenlen, , intint flags);flags);_ _( (, , ,_ _, ,g );g );? 参数说明参数说明参数说明参数说明? ?sockfdsockfd:发送数据的套接字描述符:发送数据的套接字描述符:发送数据的套接字描述符:发送数据的套接字描述符? ?msgmsg:指向发送
82、数据的指针:指向发送数据的指针:指向发送数据的指针:指向发送数据的指针? ?lenlen:数据长度:数据长度:数据长度:数据长度fl fl:一般设置为一般设置为:一般设置为一般设置为0 0? ?flagsflags:一般设置为一般设置为:一般设置为一般设置为0 0? 返回值返回值返回值返回值? ?成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数45? ?成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数? ?失败时,返回失败时,返
83、回失败时,返回失败时,返回- -1 1send()send()函数函数函数函数send()send()函数函数函数函数if (!fork() /* 子进程代码段子进程代码段 */ if (d( lifd H lld! 26 0)1)if (send(client_fd, Hello, you are connected!n, 26, 0) = -1) perror(send); close(client fd);close(client_fd); exit(0); 46recv()recv()函数函数函数函数recv()recv()函数函数函数函数? 功能功能功能功能? ?用于流式套接字的通讯
84、用于流式套接字的通讯用于流式套接字的通讯用于流式套接字的通讯? ?用于流式套接字的通讯用于流式套接字的通讯用于流式套接字的通讯用于流式套接字的通讯? ?#include sys/#include ? ?#include sys/#include y y? 函数原型函数原型函数原型函数原型? ?ssize_tssize_t recvrecv( (intint sockfdsockfd, void *, void *bufbuf, , size_tsize_t lenlen, , intint flagsflags); );? 参数说明参数说明参数说明参数说明? ?sockfdsockfd:要读的
85、:要读的:要读的:要读的SOCKETSOCKET描述符描述符描述符描述符:要读的信息的缓冲区要读的信息的缓冲区:要读的信息的缓冲区要读的信息的缓冲区? ?bufbuf:要读的信息的缓冲区要读的信息的缓冲区:要读的信息的缓冲区要读的信息的缓冲区? ?lenlen:缓冲的最大长度:缓冲的最大长度:缓冲的最大长度:缓冲的最大长度? ?flagsflags:一般设置为一般设置为:一般设置为一般设置为0 0? ?flagsflags:一般设置为一般设置为:一般设置为一般设置为0 0? 返回值返回值返回值返回值? ?成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数成功时成功时,返回实
86、际接收到的数据的字节数返回实际接收到的数据的字节数47? ?成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数? ?失败时,返回失败时,返回失败时,返回失败时,返回- -1 1send()/recv()send()/recv()中的中的中的中的flagsflags说明说明说明说明send()/recv()send()/recv()中的中的中的中的flagsflags说明说明说明说明? MSG_DONTROUTEMSG_DONTROUTE? ?是是是是send()send()的使用标志,不查找路由表,表示目
87、的主机在本地网络的使用标志,不查找路由表,表示目的主机在本地网络的使用标志,不查找路由表,表示目的主机在本地网络的使用标志,不查找路由表,表示目的主机在本地网络? MSG_OOBMSG_OOB接受或者发送带外数据接受或者发送带外数据接受或者发送带外数据接受或者发送带外数据? ?接受或者发送带外数据接受或者发送带外数据接受或者发送带外数据接受或者发送带外数据? MSG_PEEKMSG_PEEK? ?是是是是recv()recv()的使用标志的使用标志,查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据的使用标志的使用标志,查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区
88、移走数据? ?是是是是recv()recv()的使用标志的使用标志,查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据的使用标志的使用标志,查看数据查看数据,并不从系统缓冲区移走数据并不从系统缓冲区移走数据? MSG_WAITALLMSG_WAITALL? ?是是是是recv()recv()的使用标志的使用标志,表示等待所有数据表示等待所有数据,阻塞式接收阻塞式接收,直到满足条直到满足条的使用标志的使用标志,表示等待所有数据表示等待所有数据,阻塞式接收阻塞式接收,直到满足条直到满足条? ?是是是是recv()recv()的使用标志的使用标志,表示等待所有数据表示等待所有数据,阻
89、塞式接收阻塞式接收,直到满足条直到满足条的使用标志的使用标志,表示等待所有数据表示等待所有数据,阻塞式接收阻塞式接收,直到满足条直到满足条件或发生错误件或发生错误件或发生错误件或发生错误? ?读到指定字节时,正常返回,返回值等于读到指定字节时,正常返回,返回值等于读到指定字节时,正常返回,返回值等于读到指定字节时,正常返回,返回值等于lenlen? ?读到文件尾,正常返回,返回值小于读到文件尾,正常返回,返回值小于读到文件尾,正常返回,返回值小于读到文件尾,正常返回,返回值小于lenlen? ?操作错误时,返回操作错误时,返回操作错误时,返回操作错误时,返回- -1 148recv()recv
90、()函数函数函数函数recv()recv()函数函数函数函数#define MAXDATASIZE 100 /*每次最大数据传输量每次最大数据传输量 */i ti (i th*)int main(int argc, char *argv) int recvbytes;int recvbytes;char bufMAXDATASIZE;if (recvbytes = recv(sockfd, buf, MAXDATASIZE, 0) = -1) ()it(1)perror(recv); exit(1); 49sendto()sendto()函数函数函数函数sendto()sendto()函数函数
91、函数函数?功能功能功能功能用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯? ?用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯? ?#include sys/#include ? ?#include sys/#include ? ?#include sys/#include ?函数原型函数原型函数原型函数原型? ?i ti tdtdt ( (i ti tkfdkfdtid *tid *i ti t lidlid i ti t? ?intint sendtosendto( (intint sockfdsockfd,
92、 const void *, const void *msgmsg, , intint len,unsignedlen,unsigned intintflags,constflags,const structstruct sockaddrsockaddr *to*to, , intint tolentolen); ); ?参数说明参数说明参数说明参数说明?参数说明参数说明参数说明参数说明? ?toto:目地机的:目地机的:目地机的:目地机的IPIP地址和端口号信息地址和端口号信息地址和端口号信息地址和端口号信息? ?tolentolen:常被赋值为常被赋值为:常被赋值为常被赋值为sizeofs
93、izeof ( (structstruct sockaddrsockaddr) )? ?tolentolen:常被赋值为常被赋值为:常被赋值为常被赋值为sizeofsizeof ( (structstruct sockaddrsockaddr) ) ?返回值返回值返回值返回值? ?成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数50? ?成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数成功时成功时,返回实际发送的数据的字节数返回实际发送的数据的字节数? ?失败时,返回失败时,返回失败时,返回失
94、败时,返回- -1 1recvfrom()recvfrom()函数函数函数函数recvfrom()recvfrom()函数函数函数函数?功能功能功能功能用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯? ?用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯用于数据报套接字的通讯? ?#include sys/#include ? ?#include sys/#include ? ?#include sys/#include ?函数原型函数原型函数原型函数原型? ?i ti tf f( (i ti tkfdidkfdid * *b fb f
95、 i ti t l lidid i ti t? ?intint recvfromrecvfrom( (intint sockfd,voidsockfd,void * *bufbuf, , intint lenlen, unsigned , unsigned intintflags, flags, structstruct sockaddrsockaddr *from*from, , intint * *fromlenfromlen); ); ?参数说明参数说明参数说明参数说明?参数说明参数说明参数说明参数说明? ?fromfrom:保存源机的:保存源机的:保存源机的:保存源机的IPIP地址及端
96、口号地址及端口号地址及端口号地址及端口号? ?fromlenfromlen:常常被赋值为常常被赋值为:常常被赋值为常常被赋值为sizeofsizeof ( (structstruct sockaddrsockaddr) )? ?fromlenfromlen:常常被赋值为常常被赋值为:常常被赋值为常常被赋值为sizeofsizeof ( (structstruct sockaddrsockaddr) ) ?返回值返回值返回值返回值? ?成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数51? ?成功时成功时
97、,返回实际接收到的数据的字节数返回实际接收到的数据的字节数成功时成功时,返回实际接收到的数据的字节数返回实际接收到的数据的字节数? ?失败时,返回失败时,返回失败时,返回失败时,返回- -1 1close()close()函数函数函数函数close()close()函数函数函数函数? 功能功能功能功能? ?关闭通讯关闭通讯关闭通讯关闭通讯? ?关闭通讯关闭通讯关闭通讯关闭通讯? ?#include #include ? ?#include #include ? 函数原型函数原型函数原型函数原型? 函数原型函数原型函数原型函数原型? ?int close(int sockfd);int clos
98、e(int sockfd);? ?int shutdown(int s, int how);int shutdown(int s, int how);()()? 参数说明参数说明参数说明参数说明? ?sockfdsockfd:要关闭的:要关闭的:要关闭的:要关闭的SOCKETSOCKET描述符描述符描述符描述符? ?howhow? ?how how ? ?0 0 不允许接受不允许接受不允许接受不允许接受? ?1 1 不允许发送不允许发送不允许发送不允许发送? ?2 2不允许发送和接受不允许发送和接受不允许发送和接受不允许发送和接受( (和和和和 l()l()样样样样) )? ?2 2 不允许发
99、送和接受不允许发送和接受不允许发送和接受不允许发送和接受( (和和和和close() close() 一一样样一一样样) )? 返回值返回值返回值返回值? ?成功时,返回成功时,返回成功时,返回成功时,返回0 052? ?失败时,返回失败时,返回失败时,返回失败时,返回- -1 1IPIP地址与域名的获取地址与域名的获取地址与域名的获取地址与域名的获取IPIP地址与域名的获取地址与域名的获取地址与域名的获取地址与域名的获取?函数原型函数原型函数原型函数原型? ?#include #include ? ?struct hostentstruct hostent *gethostbyname(co
100、nst char *name);*gethostbyname(const char *name);gy();gy();? ?struct hostent *gethostbyaddr(const char *addr, size_t struct hostent *gethostbyaddr(const char *addr, size_t len, int type);len, int type);struct hostentchar *h_name; /*主机的正式名称主机的正式名称*/h*hli/*主机的别名主机的别名*/char *h_aliases; /*主机的别名主机的别名*/in
101、t h_addrtype; /*主机的地址类型主机的地址类型AF_INET */int h length;/*主机的地址长度主机的地址长度 对于对于IP4 是是4字节字节32位位*/int h_length; / 主机的地址长度主机的地址长度 对于对于IP4 是是4字节字节32位位 /char *h_addr_list; /*主机的主机的IP地址列表地址列表*/#define h_addr h_addr_list0 /*主机的第一个主机的第一个IP地址地址 */53;字符串的字符串的字符串的字符串的IPIP与与与与3232的的的的IPIP的转换的转换的转换的转换字符串的字符串的字符串的字符串的
102、IPIP与与与与3232的的的的IPIP的转换的转换的转换的转换?说明说明说明说明? ?网络上用的网络上用的网络上用的网络上用的IPIP都是数字加点都是数字加点都是数字加点都是数字加点(192.168.0.1)(192.168.0.1)构成构成构成构成? ?struct in_addrstruct in_addr结构中用的是结构中用的是结构中用的是结构中用的是3232位的位的位的位的IPIP,如,如,如,如? ?IP(C0A80001)IP(C0A80001)是是是是192.168.0.1 192.168.0.1 ?函数原型函数原型函数原型函数原型?函数原型函数原型函数原型函数原型? ?int
103、 inet_aton(const char *cp,struct in_addr *inp)int inet_aton(const char *cp,struct in_addr *inp)? ?将将将将a.b.c.da.b.c.d的的的的IPIP转换为转换为转换为转换为3232位的位的位的位的IPIP,存储在存储在,存储在存储在 inpinp指针里面指针里面指针里面指针里面将将将将a.b.c.da.b.c.d的的的的IPIP转换为转换为转换为转换为3232位的位的位的位的IPIP,存储在存储在,存储在存储在 inpinp指针里面指针里面指针里面指针里面? ?char *inet_ntoa(s
104、truct in_addr in) char *inet_ntoa(struct in_addr in) ? ?将将将将3232位位位位IPIP转换为转换为转换为转换为a b c da b c d的格式的格式的格式的格式? ?将将将将3232位位位位IPIP转换为转换为转换为转换为a.b.c.da.b.c.d的格式的格式的格式的格式?说明说明说明说明? ?函数里面函数里面函数里面函数里面代表代表代表代表ii ii,代表代表代表代表tktk54? ?函数里面函数里面函数里面函数里面 a a 代表代表代表代表 asciiascii,n n 代表代表代表代表networknetwork面向连接的面向
105、连接的面向连接的面向连接的socketsocket通信流程通信流程通信流程通信流程面向连接的面向连接的面向连接的面向连接的socketsocket通信流程通信流程通信流程通信流程客户端客户端客户端客户端socket()socket(),建立流式套接字建立流式套接字建立流式套接字建立流式套接字,返回套接字返回套接字返回套接字返回套接字服务器端服务器端服务器端服务器端k t()k t(),建立流式套接字建立流式套接字建立流式套接字建立流式套接字,返回套接字返回套接字返回套接字返回套接字() (),建立流式套接字建立流式套接字建立流式套接字建立流式套接字,返回套接字返回套接字返回套接字返回套接字号号
106、号号s sbind()bind(),套接字套接字,套接字套接字s s与本地地址相连与本地地址相连与本地地址相连与本地地址相连socket()socket(),建立流式套接字建立流式套接字建立流式套接字建立流式套接字,返回套接字返回套接字返回套接字返回套接字号号号号s sconnect()connect(),将套接字将套接字,将套接字将套接字s s与远程主机连接与远程主机连接与远程主机连接与远程主机连接listen()listen(),通知通知,通知通知TCPTCP服务器准备好接收连接服务器准备好接收连接服务器准备好接收连接服务器准备好接收连接recv()/send()recv()/send()
107、,在套接字在套接字,在套接字在套接字s s上读上读上读上读/ /写数据至完写数据至完成交换成交换写数据至完写数据至完成交换成交换accept()accept(),接收连接接收连接,等待客户端的连等待客户端的连接接,接收连接接收连接,等待客户端的连等待客户端的连接接建立连接建立连接建立连接建立连接,t()t()返回返回返回返回,得到新的套接得到新的套接得到新的套接得到新的套接closesocket()closesocket(),关闭套接字关闭套接字,关闭套接字关闭套接字s s,结束结束,结束结束TCPTCP对对话话对对话话建立连接建立连接建立连接建立连接,accept()accept()返回返回
108、返回返回,得到新的套接得到新的套接得到新的套接得到新的套接字字,如如字字,如如nsnsrecv()/send()recv()/send(),在套接字在套接字,在套接字在套接字nsns上读上读上读上读/ /写数据至写数据至写数据至写数据至完成交换完成交换完成交换完成交换closesocket()closesocket(),关闭套接字关闭套接字,关闭套接字关闭套接字nsns完成交换完成交换完成交换完成交换55closesocket()closesocket(),关闭最初套接字关闭最初套接字,关闭最初套接字关闭最初套接字s s,服务结服务结束束,服务结服务结束束面向连接的面向连接的面向连接的面向连接
109、的socketsocket通信流程通信流程通信流程通信流程面向连接的面向连接的面向连接的面向连接的socketsocket通信流程通信流程通信流程通信流程?服务器程序作用服务器程序作用服务器程序作用服务器程序作用? ?程序初始化程序初始化程序初始化程序初始化? ?持续监听一个固定的端口持续监听一个固定的端口持续监听一个固定的端口持续监听一个固定的端口? ?收到收到收到收到ClientClient的连接后建立一个的连接后建立一个的连接后建立一个的连接后建立一个socketsocket连接连接连接连接? ?与与与与ClientClient进行通信和信息处理进行通信和信息处理进行通信和信息处理进行通
110、信和信息处理? ?接收接收接收接收ClientClient通过通过通过通过socketsocket连接发送来的数据,进行相应处连接发送来的数据,进行相应处理并返回处理结果,如理并返回处理结果,如连接发送来的数据,进行相应处连接发送来的数据,进行相应处理并返回处理结果,如理并返回处理结果,如BBS ServerBBS Server? ?通过通过通过通过socketsocket连接向连接向连接向连接向ClientClient发送信息,发送信息,如如发送信息,发送信息,如如Time ServerTime Server? ?通信结束后中断与通信结束后中断与通信结束后中断与通信结束后中断与ClientC
111、lient的连接的连接的连接的连接56面向连接的面向连接的面向连接的面向连接的socketsocket通信流程通信流程通信流程通信流程面向连接的面向连接的面向连接的面向连接的socketsocket通信流程通信流程通信流程通信流程?客户程序作用客户程序作用客户程序作用客户程序作用? ?程序初始化程序初始化程序初始化程序初始化? ?连接到某个连接到某个连接到某个连接到某个ServerServer上,建立上,建立上,建立上,建立socketsocket连接连接连接连接? ?与与与与ServerServer进行通信和信息处理进行通信和信息处理进行通信和信息处理进行通信和信息处理? ?接收接收接收接收
112、ServerServer通过通过通过通过socketsocket连接发送来的数据,进行相应处连接发送来的数据,进行相应处连接发送来的数据,进行相应处连接发送来的数据,进行相应处理理理理理理理理? ?通过通过通过通过socketsocket连接向连接向连接向连接向ServerServer发送请求信息发送请求信息发送请求信息发送请求信息? ?通信结束后中断与通信结束后中断与通信结束后中断与通信结束后中断与ClientClient的连接的连接的连接的连接? ?通信结束后中断与通信结束后中断与通信结束后中断与通信结束后中断与ClientClient的连接的连接的连接的连接57面向连接的面向连接的面向连
113、接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序58面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序59面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通
114、信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序60面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序61面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客
115、户程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序62面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序63面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序面向连接的面向连接的面向连接的面向连接的socketsocket通信示例通
116、信示例通信示例通信示例客户程序客户程序客户程序客户程序64面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信流程通信流程通信流程通信流程面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信流程通信流程通信流程通信流程客户端客户端客户端客户端服务器端服务器端服务器端服务器端客户端客户端客户端客户端socket()socket(),建立流式套接字建立流式套接字,返回返回,建立流式套接字建立流式套接字,返回返回套接字号套接字号套接字号套接字号s ssocket()socket(),建立流式套接字建立流式套接字,返回返回,建立流式套接字建立流式套接字,
117、返回返回套接字号套接字号套接字号套接字号s s服务器端服务器端服务器端服务器端套接字号套接字号套接字号套接字号s sbind()bind(),将套接字将套接字,将套接字将套接字s s与远程主机连与远程主机连与远程主机连与远程主机连接接接接bind()bind(),套接字套接字,套接字套接字s s与本地地址相连与本地地址相连与本地地址相连与本地地址相连套接字号套接字号套接字号套接字号s s接接接接recvfromrecvfrom()/()/sendtosendto() (),在套接字在套接字在套接字在套接字s srecvfrom()/sendto()recvfrom()/sendto(),在套接
118、字在套接字在套接字在套接字nsns() ()() (),在套接字在套接字在套接字在套接字上读上读上读上读/ /写数据至完成交换写数据至完成交换写数据至完成交换写数据至完成交换close()close(),关闭套接字关闭套接字关闭套接字关闭套接字s s,结束结束结束结束TCPTCP()()()(),在套接字在套接字在套接字在套接字上读上读上读上读/ /写数据至完成交换写数据至完成交换写数据至完成交换写数据至完成交换close()close(),关闭套接字关闭套接字关闭套接字关闭套接字nsnsclose()close(),关闭套接字关闭套接字关闭套接字关闭套接字s s,结束结束结束结束TCPTCP
119、对话对话对话对话close()close(),关闭套接字关闭套接字关闭套接字关闭套接字nsns65面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景面向无连接通信适用场景?面向数据报面向数据报面向数据报面向数据报?网络数据大多为短消息网络数据大多为短消息网络数据大多为短消息网络数据大多为短消息?拥有大量客户拥有大量客户拥有大量客户拥有大量客户?拥有大量客户拥有大量客户拥有大量客户拥有大量客户?对数据安全性无特殊要求对数据安全性无特殊要求对数据安全性无特殊要求对数据安全性无特殊要求?网络负担非
120、常重网络负担非常重但对响应速度要求高但对响应速度要求高网络负担非常重网络负担非常重但对响应速度要求高但对响应速度要求高?网络负担非常重网络负担非常重,但对响应速度要求高但对响应速度要求高网络负担非常重网络负担非常重,但对响应速度要求高但对响应速度要求高66面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例公共函数公共函数公共函数公共函数面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例公共函数公共函数公共函数公共函数67面向无连接的面向无连接的面向无连接的面向无连接的socketsock
121、et通信示例通信示例通信示例通信示例公共函数公共函数公共函数公共函数面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例公共函数公共函数公共函数公共函数68面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序69面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信
122、示例服务器程序服务器程序服务器程序服务器程序面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序70面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例服务器程序服务器程序服务器程序服务器程序71面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户
123、程序客户程序客户程序面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序72面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序面向无连接的面向无连接的面向无连接的面向无连接的socketsocket通信示例通信示例通信示例通信示例客户程序客户程序客户程序客户程序73服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案服务器请求处理流程服务器请求处理流程
124、服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案?UDPUDP实现框架实现框架实现框架实现框架? ?没有一个客户端可以一直占用服务端没有一个客户端可以一直占用服务端没有一个客户端可以一直占用服务端没有一个客户端可以一直占用服务端? ?只要处理过程不是死循环,则服务器对于每一个客户机只要处理过程不是死循环,则服务器对于每一个客户机只要处理过程不是死循环,则服务器对于每一个客户机只要处理过程不是死循环,则服务器对于每一个客户机的请求总是能够满足的请求总是能够满足的请求总是能够满足的请求总是能够满足socket(.); socket(.); bi d( )
125、bi d( )bind(.); bind(.); while(1) while(1) recvfrom(.); recvfrom(.); process(.); process(.); p( );p( );sendto(.); sendto(.); 74服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程循环服务器方案循环服务器方案循环服务器方案循环服务器方案?TCPTCP实现框架实现框架实现框架实现框架? ?每次接受一个客户端连接每次接受一个客户
126、端连接每次接受一个客户端连接每次接受一个客户端连接? ?完成某客户所有请求后,断开连接完成某客户所有请求后,断开连接完成某客户所有请求后,断开连接完成某客户所有请求后,断开连接socket(.); socket(.); bind(.); bind(.); listen(.); listen(.); while(1) while(1) accept(.); accept(.); while(1) while(1) read(.); read(.); process(.); process(.); p( );p( );write(.); write(.); close( );close( );75
127、close(.); close(.); 服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案并发服务器方案并发服务器方案服务器请求处理流程服务器请求处理流程服务器请求处理流程服务器请求处理流程并发服务器方案并发服务器方案并发服务器方案并发服务器方案?TCPTCP实现框架实现框架实现框架实现框架socket(.); socket(.); bind(.); bind(.); listen(.);listen(.);listen(.); listen(.); while(1)while(1) accept(.); accept(.); if(if(fo
128、rk( )=0fork( )=0) ) if(if(fork(.)=0fork(.)=0) ) while(1) while(1) read(.); read(.); ( )( )process(.); process(.); write(.); write(.); close(.); close(.); exit(.); exit(.); 76 close(.); close(.); 原始套接字原始套接字原始套接字原始套接字原始套接字原始套接字原始套接字原始套接字?功能功能功能功能? ?编写出编写出编写出编写出TCP/UDPTCP/UDP套接字不能够实现的功能套接字不能够实现的功能套接字不能
129、够实现的功能套接字不能够实现的功能? ?自己创建各个头部自己创建各个头部自己创建各个头部自己创建各个头部? ?只能由有只能由有只能由有只能由有rootroot权限的用户创建权限的用户创建权限的用户创建权限的用户创建?函数原型函数原型函数原型函数原型?函数原型函数原型函数原型函数原型? ?intint sockfd(AF_INET,SOCK_RAW,protocol) sockfd(AF_INET,SOCK_RAW,protocol) ? ?根据协议根据协议(如如根据协议根据协议(如如IPPROTO ICMP, IPPROTO TCP,IPPROTO ICMP, IPPROTO TCP,根据协议
130、根据协议(如如根据协议根据协议(如如IPPROTO_ICMP, IPPROTO_TCP, IPPROTO_ICMP, IPPROTO_TCP, IPPROTO_UDPIPPROTO_UDP)创建不同类型原始套接字)创建不同类型原始套接字)创建不同类型原始套接字)创建不同类型原始套接字77原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS78原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS原始套接字示例原始套接字示例原始套接字示例原始套接字示例
131、实现实现实现实现DOSDOS79原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS80原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS原始套接字示例原始套接字示例原始套接字示例原始套接字示例实现实现实现实现DOSDOS81主要内容主要内容主要内容主要内容主要内容主要内容主要内容主要内容?背景知识背景知识背景知识背景知识? ?网间进程通信概念网间进程通信概念网间进程通信概念网间进程通信概念? ?套接字编程套接字编程套接字编程套接字编程?实验内容
132、实验内容实验内容实验内容? ?UDPUDP通信通信通信通信? ?UDPUDP通信通信通信通信? ?基于基于基于基于TCPTCP的客户的客户的客户的客户/ /服务器程序服务器程序服务器程序服务器程序82UDPUDP通信通信通信通信UDPUDP通信通信通信通信?实验说明实验说明实验说明实验说明? ?创建一个创建一个创建一个创建一个socketsocket,然后用它发送消息到以命令行参数传入,然后用它发送消息到以命令行参数传入的特定的主机和端口号的特定的主机和端口号,然后用它发送消息到以命令行参数传入,然后用它发送消息到以命令行参数传入的特定的主机和端口号的特定的主机和端口号?解决方案解决方案解决方
133、案解决方案?解决方案解决方案解决方案解决方案? ?UDPUDP编程的客户端一般步骤编程的客户端一般步骤编程的客户端一般步骤编程的客户端一般步骤? ?创建一个创建一个创建一个创建一个socketsocket使用函数使用函数使用函数使用函数socket( )socket( )? ?创建一个创建一个创建一个创建一个socketsocket,使用函数使用函数,使用函数使用函数socket( )socket( )? ?设置设置设置设置socketsocket属性,使用函数属性,使用函数属性,使用函数属性,使用函数setsockoptsetsockopt( )( )(可选)(可选)(可选)(可选)? ?使
134、用使用使用使用bind( )bind( )绑定绑定绑定绑定IPIP地址、端口等信息到地址、端口等信息到地址、端口等信息到地址、端口等信息到socketsocket上上上上 ( (可选可选可选可选) )( )( )( () )? ?设置对方的设置对方的设置对方的设置对方的IPIP地址和端口等属性地址和端口等属性地址和端口等属性地址和端口等属性? ?发送数据,使用函数发送数据,使用函数发送数据,使用函数发送数据,使用函数sendtosendto( )( )关闭网络连接关闭网络连接关闭网络连接关闭网络连接? ?关闭网络连接关闭网络连接关闭网络连接关闭网络连接? ?服务器端启动时,接收用户输入,在用户
135、指定端口打开服务器端启动时,接收用户输入,在用户指定端口打开服务器端启动时,接收用户输入,在用户指定端口打开服务器端启动时,接收用户输入,在用户指定端口打开服务监听程序服务监听程序,然后进入循环然后进入循环服务监听程序服务监听程序,然后进入循环然后进入循环服务监听程序服务监听程序,然后进入循环然后进入循环服务监听程序服务监听程序,然后进入循环然后进入循环? ?客户端请求服务时,首先通过广播机制寻找服务器,随客户端请求服务时,首先通过广播机制寻找服务器,随后建立通信连接后建立通信连接客户端请求服务时,首先通过广播机制寻找服务器,随客户端请求服务时,首先通过广播机制寻找服务器,随后建立通信连接后建
136、立通信连接83主要内容主要内容主要内容主要内容主要内容主要内容主要内容主要内容?背景知识背景知识背景知识背景知识? ?网间进程通信概念网间进程通信概念网间进程通信概念网间进程通信概念? ?套接字编程套接字编程套接字编程套接字编程?实验内容实验内容实验内容实验内容? ?UDPUDP通信通信通信通信? ?UDPUDP通信通信通信通信? ?基于基于基于基于TCPTCP的客户的客户的客户的客户/ /服务器程序服务器程序服务器程序服务器程序84基于基于基于基于TCPTCP协议的客户协议的客户协议的客户协议的客户/ /服务器程序服务器程序服务器程序服务器程序基于基于基于基于TCPTCP协议的客户协议的客户
137、协议的客户协议的客户/ /服务器程序服务器程序服务器程序服务器程序?实验说明实验说明实验说明实验说明? ?网络客户端程序,连接服务器,发送一行字符串数据网络客户端程序,连接服务器,发送一行字符串数据网络客户端程序,连接服务器,发送一行字符串数据网络客户端程序,连接服务器,发送一行字符串数据? ?网络服务端程序,等待客户端的连接,接收一行字符串网络服务端程序,等待客户端的连接,接收一行字符串网络服务端程序,等待客户端的连接,接收一行字符串网络服务端程序,等待客户端的连接,接收一行字符串数据并打印到终端,然后关闭连接,等待下一个客户端数据并打印到终端,然后关闭连接,等待下一个客户端的连接的连接数据并打印到终端,然后关闭连接,等待下一个客户端数据并打印到终端,然后关闭连接,等待下一个客户端的连接的连接?解决方案解决方案解决方案解决方案?解决方案解决方案解决方案解决方案? ?与“与“与“与“UDPUDP通信”实验类似通信”实验类似通信”实验类似通信”实验类似85第第第第9 9章章 网络通信编程网络通信编程章章 网络通信编程网络通信编程