




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程技术网络编程技术 第五讲数据报套接字编程与原始套第五讲数据报套接字编程与原始套 接字编程接字编程 网络工程系 2009 解决方法解决方法 套接字类型套接字类型 流式套接字 流式套接字 SOCK STREAM 提供面向连 接的 可靠的字节流服务 用于 提供面向连 接的 可靠的字节流服务 用于TCP 数据报套接字 数据报套接字 SOCK DGRAM 提供无连接 的 不可靠的数据报服务 用于 提供无连接 的 不可靠的数据报服务 用于UDP 原始套接字 原始套接字 SOCK RAW 允许对较低层的 协议 如 允许对较低层的 协议 如IP ICMP直接访问 直接访问 网络协议有很多种 如何建立一种 网络协议有很多种 如何建立一种通用通用机制以支持 多种协议 机制以支持 多种协议 网络工程系 2009 要求要求 掌握数据报套接字编程模型掌握数据报套接字编程模型 掌握基本函数的使用掌握基本函数的使用 了解数据报套接字编程的两种使用模式了解数据报套接字编程的两种使用模式 掌握对UDP不可靠性的解决思路掌握对UDP不可靠性的解决思路 网络工程系 2009 使用使用TCP传输数据有什么缺点 传输数据有什么缺点 服务器服务器 三次握手 建立连接 三次握手 建立连接 客户客户 四次交互 关闭连接 四次交互 关闭连接 数据传输数据传输 缺点缺点1 传输开销大 传输开销大 缺点缺点2 资源过耗 资源过耗 服务器 客户 服务器 客户 网络工程系 2009 第五讲 数据报套接字编程第五讲 数据报套接字编程 内 容 提 要 内 容 提 要 二 数据报套接字编程模型二 数据报套接字编程模型 三 数据报套接字使用模式三 数据报套接字使用模式 四 UDP的不可靠性问题四 UDP的不可靠性问题 一 数据报套接字编程的适用场合一 数据报套接字编程的适用场合 网络工程系 2009 一 数据报套接字编程的适用场合一 数据报套接字编程的适用场合 在可靠的本地环境中运行 在可靠的本地环境中运行 在不可靠的广域网环境中运行 在不可靠的广域网环境中运行 广播或多播应用程序 广播或多播应用程序 海量数据传输 海量数据传输 优点 灵活性优点 灵活性缺点 不可靠性缺点 不可靠性 不推荐 不推荐 推荐 推荐 网络工程系 2009 第五讲 数据报套接字编程第五讲 数据报套接字编程 内 容 提 要 内 容 提 要 二 数据报套接字编程模型二 数据报套接字编程模型 三 数据报套接字使用模式三 数据报套接字使用模式 四 UDP的不可靠性问题四 UDP的不可靠性问题 一 数据报套接字编程的适用场合一 数据报套接字编程的适用场合 网络工程系 2009 2 1 数据报套接字的通信过程2 1 数据报套接字的通信过程 创建套接字 指定使用UDP 不可靠的传输服 务 进行通信 创建套接字 指定使用UDP 不可靠的传输服 务 进行通信 指定本地和远端IP地址和通信端口 指定本地和远端IP地址和通信端口 关闭套接字 关闭套接字 进行数据传输 进行数据传输 网络工程系 2009 服务器工作原理服务器工作原理 server UDP client2client1 UDPUDP datagram datagram Socket receive buffer Listening server TCP Server child Server child clientclient TCPTCP connectionconnection connectionconnection connectionconnection TCP服务器 的工作原理 服务器 的工作原理 网络工程系 2009 UDP server bind socket recvfrom blocks until datagram received from client process request sendto well know port socket sendto UDP client recvfrom closesocket data request data reply closesocket 2 2 数据报套接字的编程模型2 2 数据报套接字的编程模型 网络工程系 2009 SOCKET socket int af int type int protocol 创建套接字 创建套接字 socket 指定本地地址 指定本地地址 bind int bind SOCKET s const struct sockaddr name int namelen 问题问题1 为什么服务器必须绑定 客户端不建议绑定 为什么服务器必须绑定 客户端不建议绑定 问题问题2 客户端如何将套接字与本地地址和端口号关联 客户端如何将套接字与本地地址和端口号关联 本地端口号本地端口号本地本地IP地址地址 SOCK DGRAM 2 3 基本函数2 3 基本函数 网络工程系 2009 int sendto SOCKET s const char FAR buf int len int flags const struct sockaddr FAR to int tolen 发送数据 发送数据 sendto 接收数据 接收数据 recvfrom int recvfrom SOCKET s char FAR buf int len int flags struct sockaddr FAR from int FAR fromlen 目的目的IP 目的端口号 目的端口号 INADDR BROADCAST 是否可通过from参数控制只接收特定来源的报文 是否可通过from参数控制只接收特定来源的报文 否否 int send SOCKET s const char FAR buf int len int flags int recv SOCKET s char FAR buf int len int flags 来源来源IP 来源端口号 来源端口号 网络工程系 2009 第五讲 数据报套接字编程第五讲 数据报套接字编程 内 容 提 要 内 容 提 要 二 数据报套接字编程模型二 数据报套接字编程模型 三 数据报套接字使用模式三 数据报套接字使用模式 四 UDP的不可靠性问题四 UDP的不可靠性问题 一 数据报套接字编程的适用场合一 数据报套接字编程的适用场合 网络工程系 2009 非连接模式非连接模式 连接模式连接模式 sendto 指明目标 指明目标 recvfrom 记录来源 记录来源 sendto send recvfrom recv connect 指明远程端点地址 指明远程端点地址 三 数据报套接字使用模式三 数据报套接字使用模式 怎样指明目标 怎样指明目标 连接模式连接模式 怎样获知来源 怎样获知来源 recvfrom struct sockaddr FAR from 非连接模式非连接模式 connect struct sockaddr FAR name sendto const struct sockaddr FAR to 连接模式连接模式 非连接模式非连接模式 connect struct sockaddr FAR name 问题1 如何标识通信对方的地址 问题1 如何标识通信对方的地址 A B A B 网络工程系 2009 bind socket bind socket connect connect UDP 协议 目标IP 目标端口 源IP 源端口 协议 目标IP 目标端口 源IP 源端口 IP头UDP头数据 IP头UDP头数据 IP头UDP头数据 问题2 如何控制可接收的数据报类型 问题2 如何控制可接收的数据报类型 应用进程应用进程 接收缓存接收缓存 发送 发送 send vs sendto Send 用于用于SOCK STREAM 最常用最常用 用于用于SOCK DGRAM 套接字地址通过连接 函数 套接字地址通过连接 函数connect获得获得 Sendto 用于用于SOCK DGRAM 最常用最常用 用于用于SOCK STREAM to和和tolen被忽略 此 时 被忽略 此 时 sendto send 问题3 如何选择合适的发送函数 问题3 如何选择合适的发送函数 接收 接收 recv vs recvfrom Recv 只接收已确定了连接来源的数据 只接收已确定了连接来源的数据 用于用于SOCK STREAM 最常用最常用 用于用于SOCK DGRAM 套接字地址通过连接 函数 套接字地址通过连接 函数connect获得获得 Recvfrom 用于用于SOCK DGRAM 最常用最常用 用于用于SOCK STREAM from和和fromlen被省 略 此时 被省 略 此时 recvfrom recv 问题4 如何选择合适的接收函数 问题4 如何选择合适的接收函数 一个简单的例子 UDP回射程序 网络工程系 2009 UDP client UDP ECHO server fgets fputs abc abc abc 网络工程系 2009 include stdafx h include Winsock2 h include stdio h define MAXLINE4096 max text line length define SERV PORT 7 server port Socket初始化初始化 void StartUp WSADATA wsaData WORD version MAKEWORD 2 0 int ret WSAStartup version if ret 0 printf 初始化失败初始化失败 Free the Socket void CleanUp if WSACleanup 0 printf clean失败失败 回射服务的服务器程序回射服务的服务器程序 网络工程系 2009 int main int argc char argv intsockfd struct sockaddr incliaddr servaddr StartUp if sockfd socket AF INET SOCK DGRAM 0 0 printf r n r n服务器端接收到数据 服务器端接收到数据 r n line n 0 null terminate if fputs line stdout EOF printf fputs error printf 服务器发送数据 服务器发送数据 r n sendto sockfd line n 0 pcliaddr len if fputs line stdout EOF printf fputs error else return 创建套接字创建套接字 sockfd socket AF INET SOCK DGRAM 0 服务器地址赋值 服务器地址赋值 pservaddr while fgets sendline MAXLINE fp NULL 发送用户输入的数据发送用户输入的数据 sendto sockfd sendline strlen sendline 0 pservaddr servlen 接收服务器发回的响应接收服务器发回的响应 recvfrom sockfd recvline MAXLINE 0 NULL NULL printf 客户端接收到服务器响应 客户端接收到服务器响应 r n fputs recvline stdout EOF 一定是服务器的响应吗 一定是服务器的响应吗 回射服务的客户端程序回射服务的客户端程序 网络工程系 2009 第五讲 数据报套接字编程第五讲 数据报套接字编程 内 容 提 要 内 容 提 要 二 数据报套接字编程模型二 数据报套接字编程模型 三 数据报套接字使用模式三 数据报套接字使用模式 四 UDP的不可靠性问题四 UDP的不可靠性问题 一 数据报套接字编程的适用场合一 数据报套接字编程的适用场合 网络工程系 2009 clientserverother 问题2 如果报文丢失 如何处理 问题2 如果报文丢失 如何处理 问题1 如果出现了噪音数据 客户端应该怎样分辨 问题1 如果出现了噪音数据 客户端应该怎样分辨 问题3 如果服务器没有启动 客户端如何知道 问题3 如果服务器没有启动 客户端如何知道 接收缓冲区接收缓冲区 四 UDP的不可靠性问题 网络工程系 2009 解决 增加对数据源的判断解决 增加对数据源的判断 问题1 如果出现了噪音数据 客户端应该怎样分辨 问题1 如果出现了噪音数据 客户端应该怎样分辨 发送用户输入的数据发送用户输入的数据 sendto sockfd sendline strlen sendline 0 pservaddr servlen 接收服务器发回的响应接收服务器发回的响应 recvfrom sockfd recvline MAXLINE 0 preplyaddr 网络工程系 2009 问题2 如果报文丢失 如何处理 问题2 如果报文丢失 如何处理 解决 增加对recvfrom的超时判断解决 增加对recvfrom的超时判断 创建套接字创建套接字 sockfd socket AF INET SOCK DGRAM 0 服务器地址赋值 服务器地址赋值 设置接收超时设置接收超时 nTimeOver 1000 超时时限为超时时限为1000ms setsockopt sockfd SOL SOCKET SO RCVTIMEO char 网络工程系 2009 解决 增加对ICMP端口不可达消息的接收与处理解决 增加对ICMP端口不可达消息的接收与处理 问题3 如果服务器没有启动 客户端如何知道 问题3 如果服务器没有启动 客户端如何知道 报文丢失情况报文丢失情况 请求报文丢失请求报文丢失 响应报文丢失响应报文丢失 客户客户A服务器服务器B 进一步解决 带确认的数据报服务进一步解决 带确认的数据报服务 A请求请求B转转10 000美金到美金到A帐户帐户 原理 当原理 当UDP不开放服务时返回端口不可达的不开放服务时返回端口不可达的ICMP报文 报文 网络工程系 2009 思考思考 怎样处理ICMP端口不可达消息 怎样处理ICMP端口不可达消息 网络工程系 2009 解决方法解决方法 套接字类型套接字类型 流式套接字 流式套接字 SOCK STREAM 提供面向连 接的 可靠的字节流服务 用于 提供面向连 接的 可靠的字节流服务 用于TCP 数据报套接字 数据报套接字 SOCK DGRAM 提供无连接 的 不可靠的数据报服务 用于 提供无连接 的 不可靠的数据报服务 用于UDP 原始套接字 原始套接字 SOCK RAW 允许对较低层的 协议 如 允许对较低层的 协议 如IP ICMP直接访问 直接访问 网络协议有很多种 如何建立一种 网络协议有很多种 如何建立一种通用通用机制以支持 多种协议 机制以支持 多种协议 网络工程系 2009 主要内容主要内容 原始套接字的编程模型原始套接字的编程模型 基本函数基本函数 例子程序例子程序 1 原始套接字编程模型原始套接字编程模型 网络工程系 2009 1 原始套接字编程模型原始套接字编程模型 传输方式传输方式 客户机 服务器方式客户机 服务器方式 特点特点 无连接无连接 过程过程 服务器进程和客户端进程在通信前必须创建各 自的套接字 然后对相应的套接字进行 服务器进程和客户端进程在通信前必须创建各 自的套接字 然后对相应的套接字进行 读读 写写 操作 实现数据的传输操作 实现数据的传输 网络工程系 2009 原始套接字的功能原始套接字的功能 可读 写ICMPv4 ICMPv6 IGMPv4等协议的 分组 可读 写ICMPv4 ICMPv6 IGMPv4等协议的 分组 可读 写操作系统内核不处理其协议字段的 IPv4的数据报 可读 写操作系统内核不处理其协议字段的 IPv4的数据报 可使用IP HDRINCL套接字选项自行构造IPv4 的报文头 可使用IP HDRINCL套接字选项自行构造IPv4 的报文头 原始套接字的功能更强大 原始套接字的功能更强大 网络工程系 2009 1 原始套接字编程模型原始套接字编程模型 发送数据过程 发送数据过程 socket初始化初始化 创建套接字 创建套接字 指定使用原始套接字进行通信 指 定 指定使用原始套接字进行通信 指 定IP头选项 头选项 指定目的地址和通信端口 指定目的地址和通信端口 填充头和数据 填充头和数据 发送数据 发送数据 关闭套接字 关闭套接字 结束对 结束对windows sockets dll的使用 的使用 网络工程系 2009 1 原始套接字编程模型原始套接字编程模型 接收数据过程 接收数据过程 socket初始化初始化 创建套接字 创建套接字 指定使用原始套接字进行通信 指 定 指定使用原始套接字进行通信 指 定IP头选项 头选项 设置接收选项设置接收选项 接收数据 接收数据 过滤数据 过滤数据 关闭套接字 关闭套接字 结束对 结束对windows sockets dll的使用 的使用 2 基本函数基本函数 网络工程系 2009 创建套接字 创建套接字 socketsocket 函数定义 函数定义 SOCKET socket int af int type int protocol 输入参数 输入参数 af 指定所使用的协议地址族 一般为 指定所使用的协议地址族 一般为AF INET type 指定套接字类型 此处取 指定套接字类型 此处取SOCK RAW protocol 指定网络协议 例如 指定网络协议 例如 IPPROTO IP IPPROTO ICMP IPPROTO TCP IPPROTO UDP 返回值 返回值 正确 创建的套接字句柄正确 创建的套接字句柄SOCKET 整型 整型 错误 错误 INVALID SOCKET WSAGetLastError 网络工程系 2009 设置套接字选项 设置套接字选项 setsockoptsetsockopt 函数定义 函数定义 int setsockopt SOCKET s int level int optname const char optval int optlen 输入参数 输入参数 s 套接字描述符 套接字描述符 level 选项定义的层次 如 选项定义的层次 如IPPROTO IP optname 指 定 套 接 字 选 项 的 名 字 例 如 设 为 指 定 套 接 字 选 项 的 名 字 例 如 设 为 IP HDRINCL表示要构造表示要构造IP头部 头部 optval 指向存放选项数据缓冲区的指针 指向存放选项数据缓冲区的指针 optlen 选项数据 选项数据optval缓冲区的长度 缓冲区的长度 返回值 返回值 正确 正确 0 错误 错误 SOCKET ERROR 功能 功能 为套接字相关的选项设置当前值 为套接字相关的选项设置当前值 网络工程系 2009 设置套接字选项 设置套接字选项 setsockoptsetsockopt 说明说明 套接字选项有两种类型套接字选项有两种类型 设置或禁止特征 行为的布尔选项设置或禁止特征 行为的布尔选项 设置 Optval指向一个非零整数设置 Optval指向一个非零整数 禁止 optval指向一个等于零的整数禁止 optval指向一个等于零的整数 Optlen等于布尔型数的长度Optlen等于布尔型数的长度 要求整数值或结构的选项要求整数值或结构的选项 Optval指向一个包含选项要求值的整数或结构Optval指向一个包含选项要求值的整数或结构 Optlen为此整数或结构的长度Optlen为此整数或结构的长度 网络工程系 2009 设置套接字选项 设置套接字选项 setsockoptsetsockopt 举例 举例 布尔型选项设置 布尔型选项设置 BOOL blnFlag TRUE setsockopt sock IPPROTO IP IP HDRINCL char 整数值型选项设置 整数值型选项设置 例例1 int ttl 7 TTL value setsockopt sock IPPROTO IP IP TTL char setsockopt sock SOL SOCKET SO SNDTIMEO char 4位首部长度位首部长度 4位位IP版本号版本号 unsigned char tos 8位服务类型位服务类型TOS unsigned short total len 16位总长度 字节 位总长度 字节 unsigned short ident 16位标识位标识 unsigned short frag and flags 3位标志位位标志位 unsigned char ttl 8位生存时间位生存时间 TTL unsigned char proto 8位协议位协议 TCP UDP 或其他或其他 unsigned short checksum 16位位IP首部校验和首部校验和 unsigned int sourceIP 32位源位源IP地址地址 unsigned int destIP 32位目的位目的IP地址地址 IPHDR IP头固定部分的定义头固定部分的定义 网络工程系 2009 数据发送与接收 数据发送与接收 int sendto SOCKET s const char FAR buf int len int flags const struct sockaddr FAR to int tolen 发送数据 sendto发送数据 sendto buf中的内容 中的内容 增加了与原始套接字定义相关的协议首部 如增加了与原始套接字定义相关的协议首部 如IP头 头 UDP头 头 TCP头 头 ICMP头等 头等 如果指明了如果指明了IP HDRINCL选项 则包括选项 则包括IP头 头 否则协议头部信息与否则协议头部信息与socket函数函数protocol 字段相符 字段相符 3 程序举例程序举例 网络工程系 2009 举例一 举例一 Ping的实现的实现 功能 发送功能 发送ICMP echo请求 接收目的主 机返回的 请求 接收目的主 机返回的echo应答 判断对方是否存活 应答 判断对方是否存活 实现 实现 客户端 客户端 ping 服务器端 服务器端 网络工程系 2009 typedef struct icmphdr 定义定义ICMP首部首部 u charType 类型类型 u charCode 代码代码 u shortChecksum 校验和校验和 u shortID 标识号标识号 u shortSeq 序列号序列号 ICMPHDR 举例一 举例一 Ping的实现的实现 ICMP首部首部 网络工程系 2009 举例一 举例一 Ping的实现的实现 typedef struct tagECHOREQUEST ICMP Echo请求结构请求结构 ICMPHDR icmpHdr DWORDdwTime charcData REQ DATASIZE ECHOREQUEST PECHOREQUEST typedef struct tagECHOREPLY ICMP Echo 响应结构响应结构 IPHDRipHdr ECHOREQUESTechoRequest char cFiller 256 ECHOREPLY PECHOREPLY 网络工程系 2009 举例一 举例一 Ping的实现的实现 过程 过程 创建创建socket 填充数据填充数据 发送数据发送数据 接收接收 显示结果显示结果 关闭关闭socket 网络工程系 2009 举例一 举例一 Ping的实现的实现 Main WSAStartup Ping WSACleanup Socket Gethostbyname SendEchoRequest RecvEchoReply closesocket 填充填充IP报文报文 sendto recvfrom 网络工程系 2009 举例二 服务器回射程序举例二 服务器回射程序 UDP client UDP ECHO server fgets fputs abc abc abc IP首
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区干部团建活动方案策划
- 传统店铺装修咨询方案
- 团建场地咨询报价方案
- 施工方案咨询意见
- 合肥铁路声屏障施工方案
- 景区直播营销策划方案
- 在线自学行业市场需求与分析
- 梁-拱组合结构施工方案
- 2023年度自考专业(汉语言文学)模拟试题含完整答案详解(夺冠系列)
- 2024年中医助理医师自我提分评估及答案详解【各地真题】
- 油气、集输、注水站工艺流程图的绘制
- 产科全身麻醉的应用与管理
- YS/T 261-2011锂辉石精矿
- GB 14536.9-1996家用和类似用途电自动控制器电动水阀的特殊要求(包括机械要求)
- 《百团大战》历史课件
- 国学《弟子规》 课件
- 股骨干骨折的护理查房课件
- 新款h2夜视移动电源
- 企业内部控制风险清单
- (完整)脑瘫儿童康复评估量表
- 湘郡培粹实验学校2021-2022学年九年级上学期第一次月考数学试卷
评论
0/150
提交评论