假期闲来无事,便写了个小小的网络聊天室程序。以前一直都是写MFC的有界面的程序,时间长了,便失去了兴趣,感觉有些东西经过MFC的封装,反而失去了意义,让人学不到东西,所以,丢开MFC那层的东西,直接使用socket来实现,要知道直接在黑白屏下实现有界面的那种效果,难度还是有的,喜欢挑战自我,是我的个性。

网络程序,有一些I/O模型的,阻塞的,就是你什么也不做的,就是直接开始写的recv和send的,有一个线程阻塞,所以,对对于聊天室来说,这种是不合适的;还有的就是非阻塞了,非阻塞I/O的模型很多了,而select模型,是我这次程序中用到的。

select模型

见名思意,select模型,就是使用了select函数,使用select函数,采用一种有序的方式,对多个套接字进行管理。select函数可以判断一个套接字上是否可以进行读取,或者是否可以在一个套接字上进行写入。这样就有一个好处,那就是,我们可以进行检查某一个套接字上是否可以读取,或者写入,那样的话,就不用一直在阻塞那里等待有数据进入或者有数据发送出去。

select函数详解

int select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);

其中最重要的是fd_set参数,这个是某些特定套接字的集合。大家一定要特别的理解这个集合。其它的函数,我在这里就不详细解释了,大家可以查查。fd_set集合,就是满足一些特定条件的套接字,有读的,有写的,有带外数据的。

readfds集合:

条件一:有数据可以读入

条件二:连接已经被关闭、重启或者终止

条件三:假如已经调用了listen,而且有一个连接正处于搁置状态,那么accept函数调用就会调用成功。

以上的三个条件,满足一个就ok了,其实,条件一和条件三,我个人认为是最重要的,条件二貌似可以忽略的,至少看了这么多文章我还是没有看到利用条件二而判断的。所以在这里,大家要深入了解这条件一和条件三的用法。就这么两个条件放在这里,好动,确实很难懂的。我现在给大家详细的说一下。

条件一是指有一个套接字结合,FD_SET集合,这个集合中,是可能有数据输入的套接字集合,说不定,某一个时刻,某一个套接字中就有数据就可以读入了,所以说,我们要不断的循环,select出可以读入的套接字。

看下面的代码:

while (1) { memset(recv_buf, 0x00, sizeof(recv_buf)); FD_ZERO(&readfd); FD_SET(ClientSocket, &readfd); if (select (0, &readfd, NULL, NULL, &tv) == SOCKET_ERROR) { continue; } //recv message if (FD_ISSET(ClientSocket, &readfd)) { if (recv(ClientSocket, recv_buf, sizeof(recv_buf), 0) >= 0) { ...... } else { break; } } } 上面的代码就很能说明第一个条件。

再来说说第三个条件吧。

这个结构和上面的是一样的,但是,你要注意是在listen就绪的情况下,如果有可以accept的套接字,便可以进行套接字的。我推荐一篇文章吧:服务器Select模型的实现。这篇博文不错,相信给大家的理解select有帮助。

还有writefds,这个写集合,大家也可以上网查查,这里就不过多的介绍了。

把我的这个小程序的源代码下载地址贴上吧:单机这里进入下载页面

最后祝大家有个愉快的周末,属于程序员的周末。

谢谢你的阅读,对于文章的不理解,可以给我留言。也可以给我提出意见,让我写出更好的博文。

转载于:https://www.cnblogs.com/JPAORM/archive/2011/09/03/2509880.html

使用socket实现基于select模型的网络聊天室相关推荐

  1. 基于WSAAsyncSelect模型实现的聊天室图形客户端

    对应的Linux服务器为:http://blog.csdn.net/microtong/archive/2009/12/12/4989902.aspx 头文件ClientDlg.h [cpp] vie ...

  2. 基于TCP协议的网络聊天室

    创建服务端程序 public class Server {public static void main(String[] args) {new Thread(new ServerTask()).st ...

  3. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  4. 局域网socket ip_基于局域网的小型在线聊天室(C++)

    linux:linux下C++ socket网络编程--即时通信系统(含源码)​zhuanlan.zhihu.com knowledge2018:vmware 虚拟机三种网络模式-"桥接.N ...

  5. html5 red5,一个基于red5+flash的网络聊天室red5Chat

    前两天发现一个开源的基于red5+flash的聊天室软件red5Chat,于是想搭起来玩玩,没想到遇到一大堆问题.首先到http://www.red5chat.com/下载源码red5chatv2.1 ...

  6. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  7. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  8. 基于select模型的TCP服务器

    之前的一篇博文是基于TCP的服务器和客户机程序,今天在这我要实现一个基于select模型的TCP服务器(仅实现了服务器). socket套接字编程提供了很多模型来使服务器高效的接受客户端的请求,sel ...

  9. 基于Socket通信的在线网络聊天室

    文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...

最新文章

  1. 关系管理系统:js代码生成select的出生日期
  2. 二叉树的非递归遍历(递归和非递归)
  3. PowerDesigner的使用二
  4. 一个简单粗暴的前后端分离方案
  5. java图片上传(mvc)
  6. 音视频播放、录音、拍照
  7. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
  8. linux系统下升级node,linux下安装指定版本的nodejs(升级到指定版本)
  9. Dynamic Clock in Terminal.
  10. mybatis 存储过程 tmp_count_MyBatis从入门到精通
  11. 查询某个分区是那张表_分库、分表、分区的区别
  12. java基本数据类型范围
  13. Linux Centos快速屏蔽IP访问(iptables)
  14. 企业微信第三方服务商和钉钉ISV开发对比
  15. mysql 多数据源配置文件_Spring+MyBatis多数据源配置实现
  16. Poi 4.0设置自定义背景颜色
  17. matlab求解三次多项式,【MATLAB编程】三次样条
  18. 如何在未越狱iOS设备上安装IPA
  19. 【C++ 二分函数——lower_bound upper_bound用法】
  20. 大数据入门第零天——总体课程体系概述

热门文章

  1. HDU-5876 Sparse Graph
  2. BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推
  3. PowerDesigner中的CDM设计的外键作主键的问题
  4. 搭建SVN服务器详细过程 及 使用方法 Windows端
  5. ubuntu 18.04 设置中文输入法
  6. 搞不明白老板想要看哪种报表,熬夜做到两点也是白费28
  7. 如何用敏捷搞垮一个IT团队?
  8. 阿里大牛总结:学会这些Kafka知识,吊打面试官就是分分钟的事
  9. 设置手机项目首选参数
  10. python三大神器_常用Python代码及花式写法(函数调用自身+三大神器)