没有合适的资源?快使用搜索试试~ 我知道了~
1. 自定义数据结构,封装需要的变量及内存空间,本实验数据结构名称为 StateObject 2. 编写回调的任务处理函数,本实验中命名为 ReceiveCal
资源详情
资源评论
资源推荐
实 验 六 TCP 多连接管理
6.1 实验目的
本实验项目实现了 TCP 多连接的建立与稳妥断开。服务端执行监听客户端主动连接建立连
接,数据通信任务完成后,通信过程中配对的 Socket 对象的任一方都可主动发起请求断开连接。
6.2 TCP 连接中多个 Socket 对象的管理
将客户端与服务端的线程对象结合 TCP 通信流程模式可由图6-2进行描绘,它展示了 TCP
通信时服务端两线程的 Socket 对象工作原理及联系。
网络通信的驱动程序在 TCP 通信过程中执行特别的任务,网络出现的连接请求数据包经
驱动程序识别后,创建用于数据通信的 Socket 对象。驱动程序以链表的形式管理 TCP 服务
端的多个通信的 Socket 对象,用户程序通过 Accept 方法获得这个 Socket 对象。用户程序调
用 Socket 对象的 Close 方法后,资源句柄值仍存在,但对应的资源已被驱动程序回收,这时
Socket 对象不为 null 但是对象成员变为不可用。
处于连接状态的 Socket 对象具有 LocalEndPoint 与 RemoteEndPoint 属性,客户端与服务
端进行通信的两个 Socket 对象形成配对。图6-3指出 Socket 对象间的 IP 与 PORT 分配关系,
在服务端所有已连接的 Socket 对象其本地 Port 与 IP 都是一样的,且 Port 值就是监听端口值。
同个主机可向相同的服务器端口发起多个连接,客户端 Socket 对象本地 IP 值都相同端口值必
须不相同。连到同个服务器的不同主机客户端 Socket 对象的本地端口值随机出现。
图 6-1 TCP 的非正常断开
6.3 TCP 连接的稳妥断开
TCP 实现的是数据双向通信,通信两端调用 Socket 对象的 Shutdown 方法分别指定传输断
开。TCP 通信中配对的 Socket 对象实现稳妥断开,应按照表6-1列出的操作序列执行 Shutdown
1
实验六 2
方法。配对的 Socket 对象没有执行 ShutDown 方法,直接执行 Close 方法将引起程序异常,如
图??。
表 6-1 TCP 连接的稳妥断开
客户端 服务端
调用 ShutDown 方法,客户端表示
不再发送数据
服务端收到 FD_CLOSE 消息,开始
断开连接,无后续可接收数据
客户端此时仍可继续接收数据 服务端继续向客户端发送后续数据。
服务端调用 ShutDown 方法,表示不
再发送数据。
客户端收到 FD_CLOSE 消息
客户端调用 Close 方法清除资源 服务端调用 Close 方法清除资源
通信的断开由任一方主动发起,另一方收到断开请求后仍可继续发送数据,双方都无数据
发送且都执行了 Shutdown 方法后连接稳妥断开。Socket 对象具有 Connected 属性指示连接状
态,false 表示非连接状态。Connected 属性是只读的,无法通过对其赋值控制 Socket 对象的连
接状态,尝试对其赋值将引发异常。
6.4 实验内容
本小节包含项目 TcpManC 实现客户端任务,TcpManS 实现服务端任务,互相配合实现十
个 TCP 连接演示连接建立与稳妥断开操作过程。因为线程对象运行时消耗资源较多,客户端
与服务端由一个工作线程用数组管理通信的十个 Socket 对象。
网络函数任务返回时间是不确定的,程序以异步回调的方式将更加灵活,TCP 通信中常用
的函数有 Accept、Connect、Receive、Send 等,以 Receive 函数说明采用异步方式实现网络任
务的几个关键步骤:
1. 自定义数据结构,封装需要的变量及内存空间,本实验数据结构名称为 StateObject。
2. 编写回调的任务处理函数,本实验中命名为 ReceiveCallback;
3. ReceiveCallback 函数中必须调用 EndReceive 方法完成一次回调任务周期;
4. 线程调用异步函数 BeginReceive,并按规定传入变量;
接收数据的回调任务处理函数 ReceiveCallback 中必须调用 EndReceive 方法完成一次成
功的数据接收,EndReceive 方法的返回整型数值表示接收到的应用数据的字节数。当一方执
行 Shutdown 方法后驱动程序发送不包含用户数据的包,包的头部含有 FD_CLOSE 消息的
标志位,回调函数 ReceiveCallback 仍被调用,这时 EndReceive 方法的返回值为 0。一般用
户数据长度是任意的,回调函数 ReceiveCallback 每次接收的数据长度不能超过最大值,函数
ReceiveCallback 应根据情况继续调用 BeginReceive 函数完成后续数据的接收。实现代码在后
面的小节提供。
函数 ReceiveCallback 的参数必须是 IAsyncResult 接口类型,这个函数将由驱动程序在数
据到达时调用,并传入封装好的 IAsyncResult 类型对象,用户自定义数据结构对象 StateObject
作为 BeginReceive 函数的参数被传入,代码 (StateObject)ar.AsyncState 获取这个结构对象。
2
实验六 3
图 6-2 TCP 两线程连接模型
3
剩余14页未读,继续阅读
爱设计的唐老鸭
- 粉丝: 19
- 资源: 291
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- rainy-day.jpg
- IMG_20240501_171218.jpg
- Swift-内购封装swift版本
- 经典CNN网络之ResNet 图像分类网络实战项目:7种小麦叶片病害分类(迁移学习)
- Java毕设之ssm010基于ssm的新能源汽车在线租赁管理系统+vue.rar
- Java毕设之ssm009毕业生就业信息统计系统+vue.rar
- Java毕设之ssm008医院门诊挂号系统+jsp.rar
- Java毕设之ssm007亚盛汽车配件销售业绩管理统+jsp.rar
- Java毕设之ssm006基于java的少儿编程网上报名系统+vue.rar
- Java毕设之ssm005基于SSM框架的购物商城系统+jsp.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0