VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 3163|回复: 46

VC++打造局域网聊天室-[6]异步IO模型及多线程

[复制链接]
01_avatar_middle
online_admins 发表于 2017-12-25 23:28:59 | 显示全部楼层 |阅读模式
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]客户端队列及其处理线程
12_avatar_middle
在线会员 发表于 2018-3-2 09:19:03 | 显示全部楼层
线程池和多线程的区别是什么?
20_avatar_middle
在线会员 发表于 2018-6-23 15:59:18 | 显示全部楼层
自从我加了
#pragma once
class CChatRoomDlg;
这句话,我的程序就编译不过了。
91_avatar_middle
在线会员 发表于 2019-1-10 19:45:58 | 显示全部楼层
谢谢分享谢谢分享
20_avatar_middle
在线会员 发表于 2019-1-13 12:45:47 | 显示全部楼层
我也想看看
95_avatar_middle
在线会员 发表于 2019-2-18 08:23:33 | 显示全部楼层
感谢老大的无私奉献!!!
98_avatar_middle
在线会员 发表于 2019-2-24 07:13:04 | 显示全部楼层
谢谢分享  学习
61_avatar_middle
在线会员 发表于 2019-2-24 22:44:40 | 显示全部楼层

谢谢分享谢谢分享
80_avatar_middle
在线会员 发表于 2019-3-4 09:12:36 | 显示全部楼层
VC++打造局域网聊天室-[6]异步IO模型及多线程 [修改]
85_avatar_middle
在线会员 发表于 2019-3-13 12:28:44 | 显示全部楼层
感谢分享,学习一下!
67_avatar_middle
在线会员 发表于 2019-3-24 16:34:26 | 显示全部楼层
赞!!!!!!!!!!
56_avatar_middle
在线会员 发表于 2019-3-29 00:59:15 | 显示全部楼层
感谢老大的无私奉献!!!
42_avatar_middle
在线会员 发表于 2019-4-2 17:48:35 | 显示全部楼层
VC++打造局域网聊天室-[6]异步IO模型及多线程
74_avatar_middle
在线会员 发表于 2019-4-4 11:47:49 | 显示全部楼层
VC++打造局域网聊天室-[6]异步IO模型及多线程
52_avatar_middle
在线会员 发表于 2019-4-14 12:11:18 | 显示全部楼层
感谢大佬~学习!VC++打造局域网聊天室-[6]异步IO模型及多线程
34_avatar_middle
在线会员 发表于 2019-4-17 00:29:19 | 显示全部楼层
VC++打造局域网聊天室-[6]异步IO模型及多线程
38_avatar_middle
在线会员 发表于 2019-4-26 22:38:45 | 显示全部楼层
你好,想找一下源码到底在哪里
84_avatar_middle
在线会员 发表于 2019-5-4 09:51:54 | 显示全部楼层
看下个需要先学习这个。感谢分享
67_avatar_middle
在线会员 发表于 2019-5-8 01:28:04 | 显示全部楼层
66666666666666
23_avatar_middle
在线会员 发表于 2019-5-9 20:48:29 | 显示全部楼层
做的好棒 加油
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-9-20 07:55

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表