您好,欢迎进入某某沙盘有限公司官网!

咨询热线:

400-888-8888

谈谈网络编程(基于C++)

发布时间:2021-06-08人气:
本文摘要:这里讲了一点网络编程的一些新路,一点体悟。学习就是这种不停总结提高的历程。 设计到历程,线程,线程池,reactior和proactor并发编程模式,IOCP,linux下的epoll。

欧洲杯竞猜

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

设计到历程,线程,线程池,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 协议  紧接着学习转为实践,想想网络通信的场景:一个 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++,这里,讲了,一点

本文来源:欧洲杯竞猜-www.usa-master.com


400-888-8888