这里讲了一点网络编程的一些新路,一点体悟。学习就是这种不断总结提高的过程。

设计到进程,线程,线程池,reactior和proactor并发编程模式,IOCP,linux下的epoll。。。。。

讲到这里就要提一下 socket 技术了,要想理解socket自然要学习 TCP/IP 协议,对于 TCP/IP 的理论,学习 Richard 的《TCP/IP 详解卷1:协议》我认为是不二的选择,这本书涵盖内容很多,如果对于只是实现C/S通信的网络库而言,仅需要了解其中介绍 UDP 和 TCP 的章节就好,扎实的理论基础会为你以后遇到网络传输中出现的问题给予很好的解释,也便于你解决这些问题。理论联系实现,还是 Richard 的《UNIX 网络编程卷1:套接口 API》(俗称 UNP1),这本书我一直在看,但是还没看完,我认为这是网络编程的圣经,你掌握了这本书,基本也就掌握了网络编程,甚至细枝末节也能覆盖到。这边也推荐几个视频给大家看看。。。。

TCP/IP协议栈深度解析丨实现单机百万连接丨优化三次握手、四次挥手丨优化TCP的传输速率丨epoll原理剖析和面试必问的问题_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

c/c++Linux实战训练精讲丨徒手实现网络协议栈丨TCP/IP协议栈丨面试必备系列_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

以下只涉及 TCP 协议

  紧接着学习转为实践,想想网络通信的场景:一个 server 要对应成百上千..个客户,这样必须要考虑到 server 的处理能力。

  最简单的模型就是你用一个进程来处理所有的客户端连接,my god!你想想,在处理过程中如果有上百个连接同时请求服务,我们采用这种模式,首先下一个连接要等着上一个连接处理完(同步),这个在处理的连接还很有可能阻塞在数据操作(I/O)上,这样处理连接的效率之差及客户端的响应之慢我想几乎没有人能忍受吧。

  好,为了提高效率,我们改进一下,对每一个客户连接产生一个线程(windows)或进程(linux)来处理,抛开线程或进程的上下文切换损耗不谈,也不谈 SMP,就单单看产生成千上百个线程和进程的可行性,对不起,咱操作系统可是有线程或进程资源上限的。

  为了解决线程频繁切换造成的资源损耗和资源数限制问题,我们再改进一下,采用一个线程池来处理部分连接,其他连接排队等候,毕竟咱 cpu 不多,同时也就能处理那么几个连接,响应效率和处理效率依然提不上去。

  想一个问题,其实我们的网络耗时一般都是在数据操作上(I/O),为了增加客户端的响应,我们可以把一次网络接入分为处理连接的线程和进行逻辑处理的线程,这样就可以极大地提高客户端的响应,但是记住一定要在逻辑处理线程中维护住这个连接的会话。这样仿佛还不错,no,no,其实也不好,你并不知道什么时候有数据到来需要处理,你必须要轮询来确定可不可以进行数据操作….,效率还是不好啊。

  好了,咱不自己独创技术了,选用经典的 Reactor 和 Proactor 并发编程模式,他们都是基于事件驱动的,咱呢就是把网络中需要处理的事件注册到事件管理器中去(比如网络行为事件,IO 操作事件…..),然后等事件状态就绪了,他就用回调的方式通知咱去处理,怎么样,这样至少 CPU 不会闲着了,只用一个线程就可以处理几乎所有的事件了。但是 Reactor 和 Proactor 还是有很大区别的,Reactor 对于I/O这一步是需要自己处理的,但是 Proactor 对于I/O这一步是由操作系统完成的,然后把完成事件通知你,然后你就可以进行下一步操作了(比如从缓冲区 buf 里读数据),比自己操作I/O这种方式快多了吧。目前,我在 windows 下写网络库采用的是 Proactor 模式:用 windows 自己提供的完成端口模型(IOCP)实现,在 linux 下,由于 linux 没有很好的异步I/O机制,只好采用 Reactor 方式了:使用的是 linux 特有的 epoll。

  谈一些我自己的看法:从我的理解上,对于大部分网络库而言,很多都是I/O密集型的,这样仿佛采用 Proactor 模式更有优势,但是 linux 下没有和 windows 下 IOCP 类似的机制,但是可以采用 epoll 加任务队列的方式实现一套,但是仿佛很复杂,我想自己实现就算了吧。好在“山穷水复疑无路,柳暗花明又一村”,boost asio 已经为我们封转好了 windows 和 linux 下的 Proactor 实现,windows 采用的是完成端口,linux 下采用的是 epoll 加任务队列的方式实现。下一步我准备把目前 linux 下采用 epoll 方式实现的 Reactor 网络库改为 boost asio 的实现。

今天,对于网络编程先总体并且概括的介绍下吧,其实还有很多问题没有涉及,我本人对网络编程十分的感兴趣,现在也在从事这方面的工作,所以以后有机会希望和大家一起分享一些更细致全面的知识,鉴于本人水平有限,希望大家能对文章中出现的错误给予批评指正,我们一起进步……

c++网络编程连接成功后回调onconnected_谈谈网络编程(基于C++)相关推荐

  1. 解决闪讯连接成功后不能上网

    解决闪讯连接成功后不能上网 闪讯连接成功后无法使用浏览器上网,但是微信可以登录使用,并出现以下界面 解决办法 打开 控制面板 - 网络和Internet - 网络和共享中心,点击左下角 Interne ...

  2. oracle11管理员连接数据库,1.运行 cmd.exe;2.输入 sqlplus / as sysdba,以系统管理员(sysdba)身份连接数据库,进行数据库管理操作。3.连接成功后执...

    1.运行 cmd.exe: 2.输入 sqlplus / as sysdba,以系统管理员(sysdba)身份连接数据库,进行数据库管理操作. 3.连接成功后执行 alter user identit ...

  3. adb wifi 无线调试,连接成功后USB拔出后失效问题解决

    首先重复一下,adb WiFi无线调试操作简单步骤: Android Studio->File->Settings->Plugins 安装插件 ADB Wi-fi.安装成功后,重启A ...

  4. steam link连接成功后 手机蓝牙耳机没有声音

    steam link连接成功后手机外放有声音,用蓝牙耳机试了一下,发现没声音,之前我用过有线耳机是可以播放声音的,现在用有线耳机也没声音了,想着用电脑的蓝牙连接蓝牙耳机,行不通,难搞,我试了五六次先连 ...

  5. Ping测试网络是否连接成功

    Cmd界面(win加R) Ping+需要连接的ip地址 ,连接成功效果如下 连接不成功如下 PLC以太网诊断也可使用ping

  6. 微信支付成功后回调失败

    最近在做android微信支付功能,经过长久的调试,终于把能够正常支付了,但是支付成功后,点击完成,居然直接就finish掉,没有任何返回参数,这还怎么玩! 再次仔细看demo,demo有一个WXPa ...

  7. EasyConnect连接成功后,虚拟ip地位未分配

    文章目录 #问题描述: 今天公司做项目,连接上EasyConnect以后,显示连接成功,但是虚拟ip地址未分配,导致无法远程连接数据库,以及svn无法更新项目. #解决办法: 百度网上各种解决办法,没 ...

  8. win7电脑连接无线网络怎么连接服务器未响应,Win7无线网络无法连接的原因及Wifi无法连接解决方法大全...

    目前无线网络连接已经是大家使用的设备连接网络的主要方式,然而很多朋友在使用Win7系统笔记本或是电脑时会遇到Win7无线网络无法连接的问题,无线网络无法连接的原因其实有很多种,解决方法也要根据故障的原 ...

  9. ble 连接成功后找不到服务_闷声发大财的BLE芯片龙头

    来源:内容由半导体行业观察(ID:icbank)原创,作者:邱丽婷,谢谢. 你有多久没使用过蓝牙功能了?随着Wi-Fi和快传软件的普及,蓝牙(Bluethooth)这一每部手机都配备的数据传输工具,正 ...

最新文章

  1. 【Mongodb】 Replica set的主从切换测试
  2. Linux内核--网络栈实现分析(一)--网络栈初始化--转
  3. 不再颓废,重新开始,牛客第一题1016. 部分A+B (15)
  4. 题解报告:hdu 4907 Task schedule
  5. mysql主从数据库设计_mysql数据库主从库镜像原理及配置
  6. Java黑皮书课后题第3章:3.16(随机点)编写程序,显示矩形中一个随机点的坐标。矩形中心位于(0,0),宽100高200
  7. android 监听手机电量变化
  8. img加载不出来,给个默认图片。
  9. putty WinScp 免密登录远程 Linux
  10. python安装包的方法
  11. Eclipse创建springboot项目的方式
  12. android demo示例代码,Android Service demo例子使用详解(示例代码)
  13. 运维系统分析工具ss,htop,dstat
  14. Postgres数据库报错:FATAL: Peer authentication failed for user “zabbix“ Previous connection kept
  15. Js之History对象
  16. 通过url链接登录其他系统
  17. SQL server无法打开项 UNKNOWN\Components\929B2416EC4102B48A989956983ACF45\1F7B2B09C788E7644A0F08CA9C1D解决办法
  18. PSPNet | 语义分割及场景分析
  19. topaz滤镜 V1.31中文版
  20. python计算方差膨胀因子_可决系数R^2和方差膨胀因子VIF

热门文章

  1. php家检乘除,php通用检测函数集(转)_php
  2. 让美团、京东、搜狐都说好的数据仓库,牛在哪?
  3. 前端数据库——WebSQL和IndexedDB
  4. Javascript根据属性从对象数据中删除元素
  5. 27 Python - 数值 日期与时间
  6. (4.32)自定义函数整理大全
  7. JavaWeb——关于RequestDispatcher的原理
  8. phpcms的一些问题 乱码,安装
  9. bash log传到日志服务器
  10. ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)