【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现
一、前言
最近在做Matalb/Simulink与C/C++的混合编程,主要是完成TCP、UDP、SerialPort等常见通信方式的中间件设计,为Simulink模型提供数据采集及解析模块。
问题在于没有搞清楚Simulink中调用C/C++的内在机制,将测试OK的C++程序移植到mex上时,总会出现很多问题,比如通信的阻塞与非阻塞,有时候自己写半天可能在性能上并不比Matalb内置模块好,所以搞清楚一些原理性的东西还是很有必要的。
参考资料:
1. 阻塞与非阻塞socket的优缺点 https://blog.csdn.net/taotaoah/article/details/52441517
2. 创建TCP/IP客户端对象以通过TCP/IP进行通信 https://ww2.mathworks.cn/help/matlab/ref/tcpclient.html
3. 阻塞与非阻塞socket的优缺点 http://www.cnblogs.com/sunada2005/p/3591378.html
4. tcp socket阻塞与非阻塞 https://blog.csdn.net/xdshengk/article/details/51066959
5. 从linux源码看socket的阻塞和非阻塞 https://blog.csdn.net/u011418530/article/details/79875707
二、基本概念
简单转载一点上述文章中对阻塞与非阻塞的优缺点对比,其实应该是根据实际情况来选择,但没搞明白Matlab及Simulink中的TCPClient到底是阻塞还是非阻塞的实现。
所谓阻塞方式的意思是指,当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。
而对于非阻塞状态,如果没有东西可读,或者不可写,读写函数马上返回,而不会等待(这也与设置的超时时间有关)。
非阻塞,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高;
简单的讲,阻塞就是GET,非阻塞就是PUT;
阻塞好控制,不发送完数据程序不会走下去,但是对性能有影响。
非阻塞不太好控制,可能和能力有关,但是性能会得到很大提升。
阻塞式的编程方便,非阻塞的编程不方便,需要程序员处理各种返回;
阻塞处理简单,非阻塞处理复杂;
阻塞效率低,非阻塞效率高;
阻塞模式,常见的通信模型为多线程模型,服务端accept之后,对每个socket创建一个线程去recv。
逻辑上简单,适用于并发量小(客户端数目少),连续传输大数据量的情况下,比如文件服务器。
还有就是在客户端recv服务器消息的时候也经常用,因为客户端就一个socket,用阻塞模式不影响效率,而且编程逻辑上要简单得多。
非阻塞模式,常见的通信模型为select模型和IOCP模型,适用于高并发,数据量小的情况,比如聊天室;
客户端多的情况下,如果采用阻塞模式,需要开很多线程,影响效率;
另外,客户端一般不采用非阻塞模式。
未完待续....
【2018.08.13 C与C++基础】网络通信:阻塞与非阻塞socket的基本概念及简单实现的更多相关文章
- 【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记
先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了. 链接: https://blog.csdn.net/ ...
- (转)新手C#SQL语句的学习2018.08.13
1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- java网络通信:异步非阻塞I/O (NIO)
转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...
- 【2018.08.19 C与C++基础】编程语言类型系统简介(草稿)
还是先占坑,等理顺了思路再写,学过的东西总是无法系统化,感觉什么都知道一点,但一深入却是一脸懵逼. 这真的是个问题,看似很努力,却无法成为一个master. 参考链接: 1. 编程语言的类型系统为何如 ...
- 【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
在阅读C++语言的设计与演化一书时,作者多次提到希望能设计出一个自动废料收集,然而出于种种考虑,始终未将自动废料收集纳入标准讨论中,而是由Coder自己考虑是否在程序中实现废料收集. 当然了,许多Ja ...
- JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
Java NIO之多个Selector的实现Java NIO类库Selector机制解析(上) Java NIO类库Selector机制解析(下) https://www.zhihu.com/ques ...
- 网络通信 --> 同步、异步、阻塞与非阻塞介绍
同步.异步.阻塞与非阻塞介绍 聊聊同步.异步.阻塞与非阻塞
- NIO基础之同步、异步、阻塞、非阻塞
这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步.异步.阻塞.非阻塞. 一.同步与异步 同步与异步,关心的是消息通信的机制.也就是调用者和被调用者之间,消息是如何进行通知的.如果是调用者 ...
随机推荐
- python工程遇到的错误
1.SyntaxError: Non-ASCII character '\xe5' in file D:\eclipseworkspace\test\test_urllib2.py on line2 ...
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- [转]php 图片验证码生成 前后台验证
本文转自:https://www.cnblogs.com/xiaoyezi/p/3541195.html 自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一 ...
- 第一册:lesson sixty nine.
原文: The car race. There is a car race near our town every year. In 1995 ,there was a very big race. ...
- IIS发布网站 报错500.19 错误解决过程记录
首先先报上我的环境 WindowsServer 2012 IIS 8.5 网站是FrameWork 4.0 发布网站后浏览,报错信息如下: 解决过程记录如下: 1.看到这个问题首先想到的是权限问题,设 ...
- oracle 汉字转化拼音函数
FN_GETPY('中华人民共和国') -------------------------------------------------------------------------------- ...
- [android] xml文件的序列化
生成xml文件,模拟备份短信,创建短信的业务bean,创建一个domain的包放业务bean,这个业务bean里面,定义成员属性,生成get set方法,生成有参和无参的构造方法. 生成随机数,实例化 ...
- es6 语法 (set 和 map)
{ let list = new Set(); list.add(5); list.add(7); console.log('size', list, list.size); //{5, 7} 2 } ...
- 洛谷P4726 【模板】多项式指数函数(多项式exp)
题意 题目链接 Sol 多项式exp,直接套泰勒展开的公式 \(F(x) = e^{A(x)}\) 求个导\(F'(x) = A(x)\) 我们要求的就是\(G(f(x)) = lnF(x) - A( ...
- 动态的根据一个资源名获得到对应的资源id
在做项目的过程中,遇到了一个需求,在Android代码里可以通过图片的ID动态加载图片.要加载Android文件夹里面的图片,我们就要知道它的ID,要动态获取,那么就得动态获取图片的ID. 那么应该怎 ...