linux c++ socket 网络编程(2) select 异步非阻塞

原创 2013年12月02日 23:08:07

1.3. 多路复用

上面的方法可以完成单个线程处理多个socket读写的。但这样的轮询方式,一定无法应付大量的请求,因为效率太低了,仅处理网络IO就要消耗掉大量的CPU资源,这是十分不可取的。

那所谓的多路复用,就是要解决低效的问题。个人理解复用,就是将多个低速率的流,合成一个高速率的流,来达到提高利用率的目的。放在网络编程模型里的多路复用,就是将多个低速的网络IO流,合成一个高速的网络IO流,然后再由CPU处理。因为CPU的速度实在比网络IO要快太多了。

 

图表 1 select多路复用

如上图所示,一个采用select/poll/epoll进行多路复用的大致过程是,通过select/poll/epoll调用,从所有的socket中获得可读/可写的socket集合,然后对这些可读/可写的socket直接进行读取/写入操作。

与阻塞模型不同的是,阻塞模型在读写socket时,是不能得知该socket的状态的,所以在recv/send时,可能被阻塞。

而经过selectsocket集合,其状态是确定的,对其进行recv/send时,几乎可以立即执行并返回,而不会阻塞线程,从而达到将多个socket在一个线程中合并处理的效果,达到多路复用的目的。

(未完待续)

linux非阻塞式socket编程之select()用法

Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序...
  • u012654882
  • u012654882
  • 2015年04月09日 16:58
  • 784

linux c socket之异步IO

/* * File: UDPEchoClient-TimeOut.c * Author: 云守护 */ #include #include #include #include #i...
  • earbao
  • earbao
  • 2013年11月15日 11:13
  • 5722

socket异步编程--libevent的使用

libevent
  • tony2278
  • tony2278
  • 2016年08月12日 14:55
  • 908

异步Socket编程II

示例程序下面的应用程序中有两个类,一个实现Socket服务器端,另一个实现Socket客户端。Socket服务器端应用程序Socket服务器应用程序在SocketServer类中实现(文件名为Sock...
  • haobn0612
  • haobn0612
  • 2007年09月02日 11:21
  • 1438

C++服务器(六):socket 异步模型与select 的实现

之前在另一篇博客上提到一些关于socket 的异步模型的资料,其中有一篇博客写得很详细,在此附上链接: socket阻塞与非阻塞,同步与异步、I/O模型[1]这篇博客已经讲得很好了。但是我还是觉得...
  • u014613043
  • u014613043
  • 2016年04月07日 20:12
  • 3162

C++socket客户端select异步连接发送接收数据

这段时间公司项目一直用网口同底层设备交互,顾记录下,具体见代码: int RFID_STANDARDPROTOCOL_API __stdcall Socket_SendAndRecv(SOCKET ...
  • beichen_yx
  • beichen_yx
  • 2016年12月09日 14:32
  • 2389

Linux的SOCKET编程详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又...
  • hguisu
  • hguisu
  • 2012年04月10日 17:44
  • 248954

socket 异步编程(libevent)

******************************************************************************** socket 异步编程(libeve...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2014年10月17日 16:08
  • 488

Socket通信——Linux下,使用C/C++

①  什么是Socket? Socket是一个通信的端点。一对进程在网络直接通过一对socket通信,每个进程一个。 一个socket由一个IP地址和端口号确定。Socket封装了一些操作,使得网...
  • giantpoplar
  • giantpoplar
  • 2015年08月14日 11:50
  • 4844

C++服务器(一):了解Linux下socket编程

最近想要用C++写个socket的服务器,用于日常的项目开发。 不过,我是新手,那就慢慢地学习一下吧。首先,先写一段程序,用起来先。 感谢博文: Linux下 C++调用C 实现socket网络通...
  • u014613043
  • u014613043
  • 2016年03月09日 14:49
  • 984
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux c++ socket 网络编程(2) select 异步非阻塞
举报原因:
原因补充:

(最多只允许输入30个字)