




已阅读5页,还剩72页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章TCP网络编程基础 5 1套接字编程基础知识5 2TCP网络编程流程5 3服务器 客户端的简单例子5 4截取信号的例子 5 1套接字编程基础知识 5 1 1套接字地址结构5 1 2套接字地址设置5 1 3用户层和内核层交互过程 5 1 1套接字地址结构 进行套接字编程需要指定套接字的地址作为参数 不同的协议族有不同的地址结构定义方式 这些地址结构通常以sockaddr 开头 每一个协议族有一个唯一的后缀 1 通用套接字数据结构2 实际使用的套接字数据结构 1 通用套接字数据结构 通用的套接字地址类型的定义如下 它可以在不同协议族之间进行强制转换 includestructsockaddr 套接字地址结构 sa family tsa family 协议族 charsa data 14 协议族数据 1 通用套接字数据结构 协议族和地址族的关系宏PF 和AF 都定义在bits socket h头文件中 且后者与前者有相同的值 所以二者通常混用 14字节的sa data很多情况不够用structsockaddr storage 套接字地址结构 sa family tsa family 协议族 unsignedlongint ss align 内存对齐char ss padding 128 sizeof ss align 协议族数据 2 实际使用的套接字数据结构 上面两个通用socket地址结构体不易于进行如设置与获取IP地址和端口号等操作 Linux为各个协议族提供了专门的socket地址结构体structsockaddr in sa family tsin family 地址族 AF INETu int16 tsin port 端口号 网络字节序structin addrsin addr IPv4地址结构体 structin addr u int32 ts addr IPv4地址 网络字节序 2 实际使用的套接字数据结构 Linux为各个协议族提供了专门的socket地址结构体structsockaddr in6 sa family tsin6 family 地址族 AF INET6u int16 tsin6 port 端口号 网络字节序u int32 tsin6 flowinfo 流信息structin6 addrsin6 addr IPv6地址结构体u int32 tsin6 scope id scopeid 处于实验阶段 structin6 addr unsignedcharsa addr 16 IPv4地址 网络字节序 2 实际使用的套接字数据结构 所有专用socket地址类型的变量在实际使用中都需要转化为通用socket地址类型sockaddr 强制转换即可 这是因为所有的套接字函数都用sockaddr这个结构作为参数 例如bind 函数的原型为 intbind intsockfd 套接字文件描述符 conststructsockaddr my addr 套接字地址结构 socklen taddrlen 套接字地址结构的长度 5 1 2套接字地址设置 字节序问题如一个16位或32位整数 它由多个字节构成 这些字节在内存中存放的顺序就是字节序问题 小端字节序 LE 低位字节存放在低地址 高位字节存放在高地址 大端字节序 BE 高位字节存放在低地址 低位字节存放在高地址 5 1 2套接字地址设置 8 1 1 字节序检查代码 5 1 2套接字地址设置 主机的字节序虽然不能做到统一 但是对于网络上传输的变量必须用统一的方式表达 网络字节序是指多字节变量在网络传输时的表示方法 网络字节序采用高端字节序的表示方法 includeuint32 thtonl uint32 thostlong 主机字节序到网络字节序的长整型转换 uint16 thtons uint16 thostshort 主机字节序到网络字节序的短整型转换 uint32 tntohl uint32 tnetlong 网络字节序到主机字节序的长整型转换 uint16 tntohs uint16 tnetshort 网络字节序到主机字节序的短整型转换 函数中h表示主机字节序 n表示网络字节序 l表示32位 s表示16位 5 1 2套接字地址设置 是否需要交换字节的顺序 由字节转换函数的实现来保证 对于用户是透明的 进行字节序转换时 只要转换一次就可以了 不能进行多次转换 5 1 2套接字地址设置 字符串IP地址和二进制IP地址的转换inet xxx 函数inet pton 和inet ntop 函数 5 1 2套接字地址设置 Linux操作系统有一组函数用于网络地址的字符串形式和二进制形式之间的转换 其形式为inet xxx 1 inet aton 函数2 inet addr 函数3 inet network 函数4 inet ntoa 函数5 inet makeaddr 函数6 inet lnaof 函数7 inet netof 函数8 结构structin addr 5 1 2套接字地址设置 inet aton 函数原型 intinet aton constchar cp structin addr inp 将在cp中存储的点分十进制字符串类型的IP地址 转换为二进制的IP地址 转换后的值保存在指针inp指向的结构structurein addr中 当转换成功时返回值为非0 当传入的地址非法时 返回值为0 5 1 2套接字地址设置 inet addr 函数原型 in addr tinet addr char cp inet addr 函数将cp中存储的点分十进制字符串类型的IP地址转换为二进制的IP地址 IP地址是以网络字节序表达的 如果输入的参数非法 返回值为INADDR NONE 通常为 1 否则返回值为转换后的IP地址 由于 1 1111111111111111 同时是合法IP地址255 255 255 255的转换结果 所以不能用这个函数转换IP地址255 255 255 255 5 1 2套接字地址设置 inet network 函数原型 in addr tinet network char cp inet network 函数将cp中存储的点分十进制字符串类型的IP地址 转换为二进制的IP地址 IP地址是以主机字节序表达的 当成功时返回32位表示IP地址 失败时返回值为 1 5 1 2套接字地址设置 inet ntoa 函数原型 char inet ntoa structin addrin inet ntoa 函数将一个参数in所表示的Internet地址结构转换为点分十进制的4段式字符串IP地址 其形式为a b c d 返回值为转换后的字符串指针 此内存区域为静态的 有可能会被覆盖 因此函数并不是线程安全的 5 1 2套接字地址设置 inet makeaddr 函数原型 structin addrinet makeaddr intnet inthost 一个主机的IP地址分为网络地址和主机地址 inet makeaddr 函数将主机字节序的网络地址net和主机地址host合并成一个网络字节序的IP地址 例如 unsignedlongnet host net 0 x0000007F host 0 x00000001structin addrip inet makeaddr net host 5 1 2套接字地址设置 inet lnaof 函数原型 in addr tinet lnaof structin addrin 函数返回IP地址的主机部分inet netof 函数原型 in addr tinet netof structin addrin 返回IP地址的网络部分例子 constchar addr 127 0 0 1 unsignedlongip inet network addr unsignedlonghost id inet lnaof ip unsignedlongnetwork id inet netof ip 5 1 2套接字地址设置 8 2 3 inet xxx 系列函数验证 5 1 2套接字地址设置 8 2 3 inet xxx 系列函数验证 5 1 2套接字地址设置 8 2 3 inet xxx 系列函数验证 5 1 2套接字地址设置 8 2 3 inet xxx 系列函数验证 5 1 2套接字地址设置 8 2 4 inet pton 和inet ntop 函数一套安全的协议无关的地址转换函数 可以重入 支持多种地址类型 包括IPv4和IPv6 include include includeintinet pton intaf constchar src void dst 字符串到二进制constchar inet ntop intaf constvoid src char dst socklen tcnt 二进制到字符串inet pton中参数af表示网络类型的协议族 在IPv4下的值为AF INET 第2个参数src表示需要转换的字符串 第3个参数dst指向转换后的结果 在IPv4下 dst指向结构structin addr的指针 5 1 2套接字地址设置 8 2 4 5 1 3用户层和内核层交互过程 套接字参数中有部分参数是需要用户传入的 这些参数用来与Linux内核进行通信 例如指向地址结构的指针 通常是采用内存复制的方法进行 1 向内核传入数据的交互过程2 内核传出数据的交互过程 1 向内核传入数据的交互过程 intbind intsockfd conststructsockaddr my addr socklen taddrlen 地址结构的长度通过传值的方式传入内核 内核按照该值从地址结构首地址复制地址结构里的内容 2 内核传出数据的交互过程 intaccept intsockfd structsockaddr addr socklen t addrlen 从内核向用户空间传递参数的过程则相反 通过地址结构的长度和套接字地址结构指针来进行地址结构参数的传出操作 通常是两个参数完成传出操作的功能 一个是表示地址结构长度的指针 一个是表示套接字地址结构地址的指针 5 2TCP网络编程流程 5 2 1TCP网络编程架构5 2 2创建网络插口函数socket 5 2 3绑定一个地址端口对bind 5 2 4监听本地端口listen5 2 5接受一个网络请求accept 5 2 6连接目标网络服务器connect 5 2 7写入数据函数write 5 2 8读取数据函数read 5 2 9关闭套接字函数 5 2 1TCP网络编程架构 TCP网络编程有两种模式 一种是服务器模式 另一种是客户端模式 服务器模式创建一个服务程序 等待客户端用户的连接 接收到用户的连接请求后 根据用户的请求进行处理 客户端模式则根据目的服务器的地址和端口进行连接 向服务器发送请求并对服务器的响应进行数据处理 1 服务器端的程序设计模式2 客户端的程序设计模式 1 服务器端的程序设计模式 流程主要分为 套接字初始化 socket 套接字与端口的绑定 bind 设置服务器的侦听连接 listen 接受客户端连接 accept 接收和发送数据 read write 并进行数据处理 处理完毕的套接字关闭 close 2 客户端的程序设计模式 客户端模式分为 套接字初始化 socket 连接服务器 connect 读写网络数据 read write 并进行数据处理最后的套接字关闭 close 过程 3 客户端与服务器的交互过程 客户端与服务器在连接 读写数据 关闭过程中有交互过程 5 2 2创建网络插口函数socket 网络程序设计中的套接字系统调用socket 函数用来获得文件描述符 1 socket 函数介绍2 应用层函数socket 和内核函数之间的关系 1 socket 函数介绍 socket 函数建立一个协议族为domain 协议类型为type 协议编号为protocol的套接字文件描述符 如果函数调用成功 会返回一个表示这个套接字的文件描述符 失败的时候返回 1 include includeintsocket intdomain inttype intprotocol 1 socket 函数介绍 intsocket intdomain inttype intprotocol Type 用于设置套接字通信的类型 主要有SOCK STREAM 流式套接字 TCP SOCK DGRAM 数据包套接字 UDP SOCK RAW 原始套接字 Protocol 是与特定的地址家族相关的协议 如果指定为0 那么系统就会根据地址格式和套接类别 自动选择一个合适的协议 Socket 调用失败 errno的值及含义 2 应用层函数socket 和内核函数之间的关系 用户设置套接字的参数后 函数要能够起作用 需要与内核空间的相关系统调用交互 应用层的socket 函数是和内核层的系统调用相对应的 生成内核socket结构 并将socket结构和文件描述符绑定 5 2 3绑定一个地址端口对bind 在建立套接字文件描述符成功后 需要对套接字进行地址和端口的绑定 才能进行数据的接收和发送操作 1 bind 函数介绍2 bind 函数的例子3 应用层bind 函数和内核函数之间的关系 1 bind 函数介绍 bind 函数将长度为addrlen的structsockadd类型的参数my addr与sockfd绑定在一起 将sockfd绑定到某个端口上 如果使用connect 函数则没有绑定的必要 绑定的函数原型如下 include includeintbind intsockfd conststructsockaddr my addr socklen taddrlen 2 bind 函数的例子 bind 调用失败 errno的值及含义 3 应用层bind 函数和内核函数之间的关系 函数bind 是应用层函数 要使函数生效 需要将相关的参数传递给内核并进行处理 5 2 4监听本地端口listen 函数listen 用来初始化服务器可连接队列 服务器处理客户端连接请求的时候是顺序处理的 同一时间仅能处理一个客户端连接 当多个客户端的连接请求同时到来的时候 服务器并不是同时处理 而是将不能处理的客户端连接请求放到等待队列中 这个队列的长度由listen 函数来定义 1 listen 函数介绍2 listen 函数的例子3 应用层listen 函数和内核函数之间的关系 1 listen 函数介绍 listen 函数的原型如下 includeintlisten intsockfd intbacklog 其中的backlog表示内核监听队列的最大长度 达到最大长度后 服务器将不受理新的客户连接 客户端也将收到ECONNREFUSED错误信息 在内核版本2 2之前的Linux中 backlog指所有处于半连接状态 SYN RCVD 和完全连接状态 ESTABLISHED 的socket的上限 内核2 2之后backlog只表示处于完全连接状态的socket上限 2 listen 函数的例子 成功返回0 失败返回 1 listen 调用失败 errno的值及含义 3 应用层listen 函数和内核函数之间的关系 5 2 5接受一个网络请求accept 当一个客户端的连接请求到达服务器主机侦听的端口时 此时客户端的连接会在队列中等待 直到使用服务器处理接收请求 函数accept 成功执行后 会返回一个新的套接字文件描述符来表示客户端的连接 客户端连接的信息可以通过这个新描述符来获得 1 accept 函数介绍2 accept 函数的例子3 应用层accept 函数和内核函数之间的关系 1 accept 函数介绍 accept 函数的原型如下 include includeintaccept intsockfd structsockaddr addr socklen t addrlen 2 accept 函数的例子 accept 调用失败 errno的值及含义 3 应用层accept 函数和内核函数之间的关系 5 2 6连接目标网络服务器connect 客户端在建立套接字之后 不需要进行地址绑定就可以直接连接服务器 连接服务器的函数为connect 此函数连接指定参数的服务器 例如IP地址 端口等 1 connect 函数介绍2 connect 函数的例子3 应用层connect 函数和内核函数之间的关系 1 connect 函数介绍 connect 函数的原型如下 include includeintconnect intsockfd structsockaddr intaddrlen 2 connect 函数的例子 connect 调用失败 errno的值及含义 3 应用层connect 函数和内核函数之间的关系 5 2 7写入数据函数write 当服务器端在接收到一个客户端的连接后 可以通过套接字描述符进行数据的写入操作 对套接字进行写入的形式和过程与普通文件的操作方式一致 内核会根据文件描述符的值来查找所对应的属性 当为套接字的时候 会调用相对应的内核函数 intsize chardata 1024 size write s data 1024 5 2 8读取数据函数read 使用read 函数可以从套接字描述符中读取数据 在读取数据之前 必须建立套接字并连接 intsize chardata 1024 size read s data 1024 5 2 9关闭套接字函数 关闭socket连接可以使用close 函数实现 函数的作用是关闭已经打开的socket连接 内核会释放相关的资源 关闭套接字之后就不能再使用这个套接字文件描述符进行读写操作了 函数shutdown 可以使用更多方式来关闭连接 允许单方向切断通信或者切断双方的通信 includeintshutdown ints inthow 5 3服务器 客户端的简单例子 5 3 1例子功能描述5 3 2服务器网络程序5 3 3服务器读取和显示字符串5 3 4客户端的网络程序5 3 5客户端读取和显示字符串5 3 6编译运行程序 5 3 1例子功能描述 5 3 2服务器网络程序 程序的代码如下 程序按照网络流程建立套接字 初始化绑定网络地址 将套接字与网络地址绑定 设置侦听队列长度 接收客户端连接 收发数据 关闭套接字进行编写 1 初始化工作2 建立套接字3 设置服务器地址4 绑定地址到套接字描述符5 设置侦听队列6 主循环过程 5 3 2服务器网络程序 1 初始化工作 5 3 2服务器网络程序 2 建立套接字 5 3 2服务器网络程序 3 设置服务器地址4 绑定地址到套接字描述符5 设置侦听队列 5 3 2服务器网络程序 6 主循环过程 5 3 3服务器读取和显示字符串 服务器端对客户端连接的处理过程如下 先读取从客户端发送来的数据 然后将接收到的数据个数发送给客户端 07for 循环处理过程 08size read s buffer 1024 从套接字中读取数据放到缓冲区buffer中 09if size 0 没有数据 10return 11 1213 构建响应字符 为接收到客户端字节的数量 14s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农村架桥铺路施工方案
- 室内水泥瓦施工方案
- 防腐业务承揽方案范本
- 肝癌的护理题库及答案解析
- 制浆车间安全培训试题及答案解析
- 培训证券从业资格考试及答案解析
- 课件给教学带来什么氛围
- 拆建翻新改造方案范本
- 丰润旋挖机施工方案
- 秦淮区外墙防潮施工方案
- 桥架购销合同范本4篇
- 2025年江西省高考物理试卷真题(含答案)
- 2025年大麻酚油(CBD油)行业研究报告及未来行业发展趋势预测
- 白皮书政策解读-2025年国防科技与国家安全政策趋势分析方案
- 退休业务办理培训课件
- 2025-2026学年沪教版(五四学制)(2024)小学体育与健康三年级(全一册)教学设计(附目录)
- 2025-2026学年苏少版七年级美术上册(全册)教学设计(附目录)
- 2025新离婚协议书
- 2025年基金从业资格考试《证券投资基金基础知识》真题(附答案)
- 2025年国家保安员培训考试题(附答案)
- 进销存毕业论文
评论
0/150
提交评论