前言:

作为一名C++编程的还算比较新的司机,已经工作了两年多了,从学生时代开始使用mfc做界面编程,到后来使用Duilib,QT,陆陆续续做了很长时间。做开发的大家都知道界面编程是十分头疼的,要面对随时变化多样的需求,尤其是后期维护,有可能面临用户或领导一个新需求就导致界面碎掉要重新开始的尴尬境地。而且目前C++的界面开发并不能紧跟潮流,往往其他编程语言或脚本一行代码解决的问题C++需要几十行甚至上百行,开发效率低周期长是致命的,并且使用mfc或者界面库并没有很高的技术含量,并不涉及到内部核心API的代码,相对简单的代码堆叠。现在是互联网时代,大数据,机器学习,数据挖掘大行其道,为了最求新技术,跟上最新技术的脚步,一年前转到了网络编程,目前在学习机器学习算法和linux高性能网络编程。从本人一年来的工作来看,网上资料并没有非常完整的网络编程教程,工作中都是东拼西凑,因此今天(2017年8月23日)开始决定写微博。目的在于记录自己的学习心得和工作心得形成体系,并且检验自己的成果,如果能对他人起到一些辅助启发作用,那更是求之不得,本人才疏学浅,在写作过程中,如有纰漏或错误望请各路大神指正,亦可互相交流,本人QQ1169129207,接受各种批评教育。

一、windows网络编程与linux网络编程对比

说到网络编程就不能不说两大系统的对抗,网上两个主流系统的战争由来已久。我觉得实际上不必要非要争出谁输谁赢,作为使用者的我们只要能够根据自己的需求与环境选择相应的系统进行开发即可。windows的好处是图形界面相当完善,自带iocp(完成端口)轻松应对十万级乃至百万级链接,后期维护成本低,而缺点当然是需要花钱,不可定制。而linux的好处在于可以定制,免费,开源,甚至内核都可以修改,其epoll通信模型能与iocp分庭抗礼,但是由于图形界面并不完善,其服务端的编写和部署都要求程序员和维护人员有较高素质,增加人力成本。这里并没有对比效率,因为相对来说,iocp和epoll效率都不低,都是两种系统特有的通信模型,没必要比较。由于本人目前工作中基本上都在用windows网络编程,因此这里会先写windows网络编程,后续会继续完成linux高性能网络编程。

二、windows下的通信模型对比

本文希望阅读者有一定的C++网络编程基础,因此一些基础的诸如什么是TCP/IP,网络分层模型等不会描述,主要是从应用实际出发,对比各种通信模型的优劣,如遇到不懂的名词请自行百度,由于完成例程和事件在在实际中很少用因此不做说明有需要了解的请百度。

1、同步I/O与异步I/O

同步I/O与异步I/O是相对的,而且都有阻塞和非阻塞的类型,千万不能把几种I/O弄混。当一个同步过程调用发出后,调用者不能立刻得到结果,调用者会等待结果产生。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。这里是百度的解释。我们可以用快递做一个比较形象的解释。

同步阻塞I/O

快递员来送快递,你很忙或者没在家,你告诉快递员,你别走,我忙完了找你,快递员说我不走,一直等你回来签收,中间不会询问你。

同步非阻塞I/O

快递员来送快递,你很忙或者没在家,你告诉快递员,你先走,我有空告诉你,快递员说我不走,一直等你回来签收,他会不停的询问你是不是忙完了。

异步阻塞I/O

快递员来送快递,你很忙或者没在家,你告诉快递员,你别走,我忙完了找你,快递员说我不走,在这等着,但是可能同一家公司或住宅有别人的快递,快递员可以边等边送别人的,并时不时问问你忙完了吗。

异步非阻塞I/O

快递员来送快递,你很忙或者没在家,你告诉快递员,你先走,我有空挂电话告诉你,你再来,快递员说那我先走了,你忙完了告诉我我再找你签收。

一般情况下网络编程不会使用异步阻塞I/O,因此本文会对比同步阻塞I/O的一般模型,同步非阻塞I/O的select模型,以及异步非阻塞I/O的iocp模型。

2、各种通信模型的对比及应用场景

(1)一般模型

网络通信的阻塞主要在接收和发送上,一般模型通过绑定、监听、接受连接后,就会等待客户端发送数据,客户端如果不发送数据就会阻断线程,一直等待,如果想要同时处理多个客户端,就要开启相应数量的线程,无法应对大规模链接,对一般主机而言几十个链接就显得很吃力了,何况更多链接。但是其非常简单不需要什么难理解东西,一般应用在简单的软件之间一对一或者一对少量客户端的场景。

(2)select模型

select模型是典型的同步非阻塞I/O,之所以称为select模型是因为其select函数,会通过select函数不停轮训服务端的socket,是否可以接收或者发送,但是由于FD_SETSIZE的限制,单线程只能轮训64个客户端,手动修改不太合适,并且不灵活,后续文章专门介绍select模型时会介绍如何打破此限制。select模型采用轮训方式因此相对来说其效率不是非常高,但是在windows和linux下都有该模型,并且在架构设计合理的情况下应对万级链接不成问题何况还有分布式,方便移植,接收数据处理简单,可以快速编写,逻辑简单,因此在对并发要求不是十分高的情况下,可以用select模型。libevent库就是使用的select模型。

(3)IOCP模型

IOCP模型微软提供的超级通信模型,windows下特有的高效高并发异步非阻塞I/O通信模型,采用真正的proactor模式,十几个线程即可轻松应对十万级链接,支持百万级链接,与linux下的epoll并称两大高效模型,但是IOCP因为其线程池会寻找空闲线程传递接收数据,因此并不能保证同一个客户端的数据被同一线程接收处理,因此其应用层协议要带有标识,并且其接收逻辑相对复杂,尤其是在文件接收或者单次不完整接收中,很容易出错,需要注意,但是编程难度并不影响其强大的性能,在高并发,高压力的服务器下非常推荐使用IOCP。其常用库有HP_Socket。

三、总结

在实际应用中很少使用一般的socket通信模型,会根据应用场景及需求采用select模型或IOCP模型,一般涉及到局域网通信软件,仪器检测等使用select模型,而类似于网游服务端,大型网站服务端采用iocp模型。当然不是绝对的,在好的架构下select模型也不是不能抗高并发,一对一通信也不是不能用iocp,采用何种通信模型是仁者见仁的事情,还需要使用者根据实际应用场景来选择。

这次先介绍到这里,如有问题请大神们指正,再说一下QQ1169129207,下两篇会详细介绍select及iocp,包括如何使用以及使用中的注意事项,并且有我自己编写的相对成熟的服务端代码供大家参考。

C++ windows网络编程系列1—各种通信模型对比相关推荐

  1. Windows网络编程系列教程之四:Select模型

    讲一下套接字模式和套接字I/O模型的区别.先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事. 套接字模式:阻塞套接字和非阻塞套接字.或者叫同步套 ...

  2. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

  3. (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

    手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解 ----- By PiggyXP(小猪) 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了, ...

  4. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  5. Java 网络编程系列之 NIO

    Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...

  6. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  7. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu ...

  8. [C# 网络编程系列]专题十二:实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  9. 十年一遇的奇葩故障--Windows网络编程接口故障:telnet显示无法加载或初始化请求的服务提供程序...

    现象:某同事的笔记本win7x64系统,当初故障是无法使用小乌龟连接到svn服务器,但又可以正常上网,并且svn服务器端是正常的. 后来我进一步测试,发觉该电脑也不能连接到远程windows. net ...

  10. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

最新文章

  1. c语言程序设计橙皮,橙皮_中药词典C_中医中药网
  2. 数据分析精华经验分享,看看冠军是如何炼成的?
  3. mysql获取后一天_MySQL根据某一Date值获取相关时间(前一天,后一天等)
  4. ctype函数_PHP Ctype(字符类型)函数
  5. Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)
  6. 数据卡片_VISA消息:关于VCPS 2.1卡片产品的性能和交叉测试的卡片个性化数据的更新...
  7. 【OpenCV 例程200篇】03. 图像的显示(cv2.imshow)
  8. 信息学奥赛一本通C++语言——1049:晶晶赴约会
  9. 服务器虚拟化的主备,云服务器可以主备切换
  10. 大数据开发笔记(十):Hbase列存储数据库总结
  11. Android系统启动-SystemServer下篇
  12. (转)Google Fonts 的介绍与使用
  13. Sublime text 3 注册码激活码 版本号3143
  14. 随笔 2016-1-4
  15. (转)全球最神秘的高频交易巨头Jump Trading
  16. 不小心把Run Dashboard隐藏了多服务运行操作菜单找不到?springboot多服务快速启动窗口打开,按照这个办法完美解决!
  17. python雷达算法实现_一种基于Python的雷达信号处理系统及方法与流程
  18. 【Latex】PPT画图,导出emf格式,word插入emf文件并导出pdf,pdf裁剪并导出eps文件,latex插入eps文件
  19. STM32/GD32 IAP/Bootloader升级APP研究以及编程实现、hex文件格式
  20. import语句在包名前加static

热门文章

  1. SSI与Biss、Endat、Hipeface
  2. 一部农村小孩学计算机的电影,10部关于教育的电影,每一部都经典!
  3. win10浏览器html设置字体大小设置,edge字体大小设置?win10 edge浏览器字体设置技巧...
  4. 史上最强三千六百道脑筋急转弯(3)
  5. 《战舰世界》携手汉堡王开启“战舰堡胃战”主题活动
  6. matlab/simulink通...,详解MATLAB/Simulink通信系统建模与仿真
  7. Java 视频资源分享(干货)
  8. 资产管理系统测试用例
  9. matlab灰度分段线性变换优缺点,matlab分段线性变换
  10. 主生产计划 操作教程 用友u8_【用友u8操作教程(用友财务软件u8实际操作教程)】免费在线试用_软件库_选软件网...