VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 616|回复: 2

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

[复制链接]
01_avatar_middle
online_admins admin 发表于 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模板类。

附件:
VC++打造局域网聊天室-[6]异步IO模型及多线程 Inc.txt (247 Bytes, 下载次数: 4)




上一篇:VC++打造局域网聊天室-[5]Socket编程初步
下一篇:VC++打造局域网聊天室-[7]客户端队列及其处理线程

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

12_avatar_middle
在线会员 kgddy2013 发表于 2018-3-2 09:19:03 | 显示全部楼层
线程池和多线程的区别是什么?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

20_avatar_middle
在线会员 old_brother 发表于 2018-6-23 15:59:18 | 显示全部楼层
自从我加了
#pragma once
class CChatRoomDlg;
这句话,我的程序就编译不过了。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

GMT+8, 2018-12-11 02:50

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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