|
1、异步I/O模型
解决阻塞与非阻塞的好的方法就是利用Windows提供的各种异步I/O模型:
① select 选择模型
② WSAAsyncSelect 异步选择模型
③ WSAEventSelect 事件选择模型
④ 重叠I/O模型
⑤ 完成端口模型
具体的阻塞现象上节课在程序中大家看现象就知道了……
本程序使用① select 选择模型,其简单,易用。其他几种模型的介绍与使用,大家可以到网上搜索一下,这里也给大家找了几个比较不错的,用Word文档格式打包给大家了……
int select(
int nfds, //忽略,只是为了与Berkeley套接字兼容;
fd_set* readfds, //可读性Socket集合;
fd_set* writefds, //可写性Socket集合;
fd_set* exceptfds, //异常性Socket集合;
const struct timeval* timeout //超时时间;
);
Socket集合中其中至少有一个参数不能为NULL
■可读性Socket集合:
●数据可读;
●连接已经关闭、重启或中断;
●如果listen函数已经调用,且有一个连接未处理,那么调用accept函数将会成功;
■可写性Socket集合:
●数据能够发送;
●如果一个非阻塞连接调用正在被处理,连接已经成功;
■异常性Socket集合:
●如果一个非阻塞连接调用正在被处理,连接试图失败;
●OOB数据可读;
这里给大家封装了一个函数……SOCKET_Select(...);
其实select函数的作用就是去缓冲区里 “偷看” 一眼,看看有没有东西,如果有的话就返回其Socket的集合。
之后就可以根据具体的状态来调用相应的函数……
======================说 明====================
其实大家可以把有关Socket方面的操作自己封装一个类,以后方便使用,但是不建议大家使用MFC中提供的Socket类,如:CAsyncSocket(非阻塞),CSocket(阻塞),在使用多线程时候更要小心,这两个类不是线程安全的。
====================== End ====================
2、多线程:
■线程简介:
●进程是线程的容器,一个进程中至少要有一个主线程,线程才是真正执行代码的主体。
●线程可以 “并发” 运行,从而提高程序的执行效率;
●不要没有限制的去开线程,线程太多了,CPU调度切换线程的时间就会增多,结果适得其反!!!
●此外线程间的同步问题:虽然Windows为我们提供了好多种方法实现线程间同步,但还是要小心谨慎,切勿粗心大意,否则程序出问题了,都不知道问题出在哪。
●如果做服务器确实要处理成千上万个客服端请求的话,可以用线程池,具体线程池方面的知识大家可以在理解了线程的核心思想后,去网上找下这方面的资料……
●创建线程API函数:CreateThread(...) 具体参数的解释,我们到MSDN上面看……之后写代码。
MFC类中创建线程函数:AfxBeginThread(...) 最终调用的也是CreateThread,只是把一些常用的参数赋上默认的值了。
3、实现客户端队列:
每个客户端对应一个结点,此结点包含客户端的一些信息,如IP地址,Socket句柄,线程句柄等等……
实现客户端队列,服务端才能进行消息转发,进行一对多通信。
关于队列的实现模型大家可以随意选择:可以自己实现链表,或用STL模板库,或用MFC提供的CArray,CList模板类等等,具体大家善于使用哪个就用哪个。最好用可以动态增长的模型。实在不行用固定的数组也可以。
本程序中使用MFC提供的CArray模板类。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38700336/?p=8
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1d6W9azRF4FDbWTgrxB9aqw 提取码:surv
本节课件下载(回复后可见):
备注:VIP会员可免费下载本站所有资源(点击查看)!
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^ |
评分
-
查看全部评分
上一篇: VC++打造局域网聊天室-[5]Socket编程初步下一篇: VC++打造局域网聊天室-[7]客户端队列及其处理线程
|