




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课堂作业 1 基于TCP的C S程序 服务器和客户端程序的基 本流程是怎样的 使用API函数给出框架代码 2 请解释int listen SOCKET sockfd int backlog 中 backlog的具体含义 3 调用connect 时触发什么过程 4 UDP编程时可否使用connect 为什么 5 recvfrom 填入的地址的作用是什么 6 调用recvfrom 之前是否必须绑定 为什么 1 编写基于TCP的C S程序 服务器和客户端程序 的基本流程是怎样的 使用API函数给出框架代码 初始化初始化WS2 32 dll WSADATA wsaData WSAStartup MAKEWORD 2 2 创建监听套接字创建监听套接字 SOCKET sListen socket AF INET SOCK STREAM IPPROTO TCP 填充填充sockaddr in结构结构 sockaddr in sin sin sin family AF INET sin sin port htons 4567 sin sin addr S un S addr INADDR ANY 绑定监听套接字到一个本地地址绑定监听套接字到一个本地地址 if bind sListen LPSOCKADDR 进入监听模式进入监听模式 if listen sListen 2 SOCKET ERROR return 0 循环接受客户的连接请求循环接受客户的连接请求 char buffer 128 1234567 sockaddr in remoteAddr int nAddrLen sizeof remoteAddr SOCKET sClient TCPServer while TRUE 接受一个新连接接受一个新连接 sClient accept sListen SOCKADDR if sClient INVALID SOCKET continue 向客户端发送数据向客户端发送数据 send sClient buffer strlen buffer 0 关闭同客户端的连接关闭同客户端的连接 closesocket sClient 关闭监听套接字关闭监听套接字 closesocket sListen return 0 TCPClient 初始化初始化WS2 32 dll WSADATA wsaData WSAStartup MAKEWORD 2 2 创建套接字创建套接字 SOCKET s socket AF INET SOCK STREAM IPPROTO TCP if s INVALID SOCKET return 0 填写远程地址信息填写远程地址信息 sockaddr in servAddr servAddr sin family AF INET servAddr sin port htons servAddr sin addr S un S addr inet addr 连接服务器连接服务器 if connect s sockaddr 发送数据发送数据 send s hello strlen hello 0 接收数据接收数据 char buff 256 int nRecv recv s buff 256 0 if nRecv 0 HandleData buff HandleData 为数据为数据 处理函数处理函数 关闭套接字关闭套接字 closesocket s return 0 2 Q 请解释int listen SOCKET sockfd int backlog 中backlog的具体含义 A 指定了正在等待连接的最大队列长度 它的 作用在于处理可能同时出现的几个连接请求 3 Q 调用connect 时触发什么过程 A 三次握手过程 4 Q UDP编程时可否使用connect 为什么 A 可以使用 因为UDP的客户端调用connect 函数时 并不是真正地发出建立请求连接的请求 调用将从本地操作系直接返回 这样可以将服务 器的地址信息保存下来 在后续UDP端口发送数 据时 由套接字自动在发送函数中填入服务器地 址 而不需要由应用程序在调用发送函数时填入 5 Q recvfrom 填入的地址的作用是什么 A 用于返回发送方的地址 IP PORT 如果不 关心发送方地址时可设置地址参数为NULL 如果 需要回复信息则要填入参数以便sendto时使用 6 Q 调用recvfrom 之前是否必须绑定 为什么 A 不一定必须绑定 若在调用recvfrom 之前没 有调用sendto 就必须调用bind 显式绑定 若在调用recvfrom 之前调用了sendto 则由 系统自动绑定 不必显式绑定 从以下方面比较WSAAsyncSelect模型和 WSAEventSelect模型的异同 1 能处理的网络事件类型 2 得到网络事件通知的途径 3 单线程能处理的套接字个数 4 判断网络事件类型和网络错误方法 5 触发FD READ和FD WRITE的条件 具体说明 1 能处理的网络事件类型 相同 常用网络事件包括FD ACCEPT FD READ FD WRITE FD CLOSE 2 得到网络事件通知的途径 不同 WSAAsyncSelect模型由操作系统捕获网络事 件并封装成WINDWOS消息 发送到窗口程序的消 息队列中 应用程序从其消息队列中取出消息从而 获得网络事件通知 而WSAEventSelect模型是通过 等待关联的事件状态变化来获取事件通知 3 单线程能处理的套接字个数 不同 WSAEventSelect模型为64 WSAAsyncSelect模型没有限制 4 判断网络事件类型和网络错误方法 不同 WSAEventSelect模型通过调用 WSAEnumNetworkEvents 函数传入的指向 WSANETWORKEVENTS结构体的指针 lpNetworkEvents来返回网络网络事件和错误代码 if lpNetworkEvents lNetworkEvents FD 则 表示发生了对应的网络事件 if lpNetworkEvents iErrorCode FD BIT 0 表示 发生了网络错误 WSAAsyncSelect模型通过MSG的附加信息来判断 网络事件和网络错误 wParam指定发生网络事件的套接字句柄 LParam指定发生的网络事件和错误代码 其中高字位指出网络错误 采用宏 if WSAGETSELECTERROR lParam 表示发生 网络错误 低字位指出发生的网络事件 采用宏 if WSAGETSELECTEVENT lParam FD 表示发生对应的网络事件 5 触发FD READ和FD WRITE的条件 具体说明 收到FD READ事件通知的情况 1 调用 WSAAsyncSelect 对 socket 注册 FD READ 事件时 接收缓冲区中已有数据 2 接收缓冲区由空变为有数据 3 调用 recv 或 recvfrom 从接收缓冲区读取数 据时没有读完 收到FD WRITE事件通知的情况 使用connect或WSAConnect 一个套接字首次 建立了连接 针对客户端 使用accept或WSAAccept 套接字被接受以后 若send WSASend sendto或WSASendTo操 作失败 返回了WSAEWOULDBLOCK错误 而 且缓冲区的空间变得可用 Q 在TCP服务器编程时 可以对每个accept 返回的套接 字创建线程来处理该套接字上的数据收发 这样做有什么 缺点 第三章的IO模型中哪些模型能改善这一缺点 为 什么 A 缺点 线程膨胀 所有IO模型均可以改善这一缺点 Select模型 通过设置套接字集合 可以在一个集合中管 理64 default 个套接字 通过自定义FD SETSIZE管 理更多的套接字 WSAAsyncSelect模型 采用消息机制 调用 WSAAsyncSelect 将套接字和窗口句柄关联起来 理 论上可以管理的套接字数目没有限制 只是服务器性能会 下降 WSAEventSelect模型 将每个套接字和一个事件对象关联 该模型最多等待64个套接字 也就是最多处理64套接字 连接套接字增加时可以使用线程池技术 重叠IO模型 使用重叠结构投递IO请求后 重叠结构中事件 对象受信 查询重叠操作结果 处理数据 采用单线程可以 管理多个套接字 将套接字和套接字使用的IO缓冲区以对象 的形式组织成链表 通过套接字来创建其对应的缓冲区对象 包含一个重叠结构 补充习题 1 套接字工作在阻塞模式下 列举5个会阻塞的 Winsock API函数 2 列举ioctlsocket 函数两种用途 3 TCP编程时客户端程序是否需要调用bind 函数 为什么 4 重叠操作使用的重叠结构上的事件对象状态由无 信号状态变为有信号状态 是否意味着这一次重叠 操作成功完成 为什么 5 解决套接字工作在非阻塞模式下的 WSAEWOULDBLOCK错误需要解决什么根本问题 如何有效解决 1 Q 套接字工作在阻塞模式下 列举5个会阻塞的 Winsock API函数 A accept send recv sendto recvfrom 注意在非阻塞模式下这些函数不会阻塞 2 Q 列举ioctlsocket 函数两种用途 A 1 设置套接字的工作模式 2 获取套接字上可读取的数据量 3 Q TCP编程时客户端程序是否需要调用bind 函数 为什么 A 不需要 调用connect 函数时会隐式绑定 4 Q 重叠操作使用的重叠结构上的事件对象状态由 无信号状态变为有信号状态 是否意味着这一次重 叠操作成功完成 为什么 A 不一定 事件对象状态由无信号状态变为有信号状 态仅仅意味着这次操作完成 完成有两个成功和失 败两种可能 因此编程时查询重叠操作结果后对返 回值进行判断处理 5 Q 解决套接字工作在非阻塞模式下的 WSAEWOULDBLOCK错误需要解决什么根本问题 如何有效解决 A 解决套接字上何时可以读写数据 使用IO模型 Q 完成端口中per handle数据和per IO数据各有什 么作用 A 客户上下文对象 单句柄数据 主要作用在于 关联完成端口时传递套接字信息 在查询完成端 口时该套接字信息会通过lpCompletionKey参数 返回 缓冲区对象 单IO数据 主要作用在于投递重 叠IO时传递IO信息 包括缓冲区 IO类型 OVERLAPPED结构等等 在查询完成端口时通 过lpOverlapped参数返回投递IO时使用的重叠结 构地址 通过该该结构获得投递IO时使用单IO数 据 通过二者可以确定已完成IO的套接字以及该套接 字上的IO信息 进而处理数据 Q 实现广播和多播时能否使用流式套接字 为什么 A 实现广播和多播时 不能使用流式套接字 只能使用数据报套接字 流式套接字一旦 建立后 其通信的端点就固定不变 通信 只能在两个端点之间进行 而广播和多播 通信是一对多的通信 显然流式套接字不 能满足要求 而数据报套接字为无连接的 指定发送的目的地址即可 Q 接收广播数据和接收一般UDP数据有什么不同 A 不同在于接收广播数据时必须显示绑定到发送 时的目的端口 而接收普通UDP数据时可以在 sendto 调用时隐式绑定 Q 发送自己封装的UDP数据报应遵循什么步骤 A 1 首先以IPPOTO UDP为协议类型创建一个 原始套接字 打开原始套接字上的IP HDRINCL 选项 2 然后构建UDP封包 先设置IP头 再设置UDP头 最后设置数据 3 初始化完整的UDP封包之后 调用sendto函数即可 将它发送 Q 阐述路由跟踪
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【淮安】2025年江苏淮安市金湖县事业单位公开招聘工作人员96人笔试历年典型考题及考点剖析附带答案详解
- 第四章氧化还原反应第四节元素标准电极电势图及其应用无机化学
- 第三节组合体本节主要内容00课件
- 云霓课件教学设计
- 小学生科普显微镜课件
- 2025年小学语文教师招聘考试测试卷及答案
- 基金从业人员资格考试资料2025年含答案
- 2025矿山开采项目社会稳定风险评估与风险评估产业创新报告
- 口才课件自我介绍模板
- 企业房产租金管理办法
- 《尿路感染诊治指南》课件
- 特征值优化设计-洞察分析
- 市场营销策划岗位招聘笔试题与参考答案(某大型央企)
- 2024年高考英语新课标1卷读后续写教学设计
- 市医院开展“小金库”专项治理工作方案
- PDCA提高便秘患者肠镜检查肠道准备合格率
- 淮南新东辰控股集团有限责任公司招聘笔试题库2024
- 03D201-4 10kV及以下变压器室布置及变配电所常用设备构件安装
- 人民网删除稿件(帖文)申请登记表
- (正式版)YBT 6328-2024 冶金工业建构筑物安全运维技术规范
- 诊所中药饮片清单
评论
0/150
提交评论