一、前言

最近在做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的基本概念及简单实现的更多相关文章

  1. 【2018.08.13 C与C++基础】C++语言的设计与演化读书笔记

    先占坑 老实说看这本书的时候,有很多地方都很迷糊,但却说不清楚问题到底在哪里,只能和Effective C++联系起来,更深层次的东西就想不到了. 链接: https://blog.csdn.net/ ...

  2. (转)新手C#SQL语句的学习2018.08.13

    1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...

  3. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  4. java网络通信:异步非阻塞I/O (NIO)

    转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...

  5. 【2018.08.19 C与C++基础】编程语言类型系统简介(草稿)

    还是先占坑,等理顺了思路再写,学过的东西总是无法系统化,感觉什么都知道一点,但一深入却是一脸懵逼. 这真的是个问题,看似很努力,却无法成为一个master. 参考链接: 1. 编程语言的类型系统为何如 ...

  6. 【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入

    在阅读C++语言的设计与演化一书时,作者多次提到希望能设计出一个自动废料收集,然而出于种种考虑,始终未将自动废料收集纳入标准讨论中,而是由Coder自己考虑是否在程序中实现废料收集. 当然了,许多Ja ...

  7. JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章

    Java NIO之多个Selector的实现Java NIO类库Selector机制解析(上) Java NIO类库Selector机制解析(下) https://www.zhihu.com/ques ...

  8. 网络通信 --> 同步、异步、阻塞与非阻塞介绍

    同步.异步.阻塞与非阻塞介绍 聊聊同步.异步.阻塞与非阻塞

  9. NIO基础之同步、异步、阻塞、非阻塞

    这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步.异步.阻塞.非阻塞. 一.同步与异步 同步与异步,关心的是消息通信的机制.也就是调用者和被调用者之间,消息是如何进行通知的.如果是调用者 ...

随机推荐

  1. 使用LayoutInflater添加一个布局引用

    LayoutInflater 与 xml 的<include/>的区别,至今没搞清楚,下面记录一下LayoutInflater引用一个布局并立即显示呈现的方法: private void ...

  2. [转]Angular4 数据请求 POST、GET

    本文转自:https://blog.csdn.net/dailuwen/article/details/79375980 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  3. 【转载】ASP.NET MVC设置允许跨域访问

    默认情况下,浏览器端发送Ajax请求一般被禁止跨域访问,如A域名网站访问B域名网站的请求会被终止,在ASP.NET MVC项目中,我们可以配置相应的设置项,允许网站的接口跨域访问,主要需要设置Acce ...

  4. 从零开始学安全(二十四)●用Nmap发现主机

    首先了解端口状态 常用 都是 open closed  filtered    状态 打开  cmd  输入  nmap -A  192.168.11.11   后面是你的 ip 可以扫描打开的端口状 ...

  5. Linux-read 命令(20)

    Linux read 命令 参数说明: -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符. -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志. -p ...

  6. JS基础(三)构造函数

    JS中的构造函数 <script language="JavaScript"> window.onload = function(){ function Bottle( ...

  7. JavaScript事件(含Demo)

    主要事件: onclick 鼠标单击事件 onmouseover 鼠标经过事件 onmouseout 鼠标移开事件 onchange 文本框内容改变事件 onselect 文本框内容被选中事件 onf ...

  8. 人类阅读的优越方式打印php数组

    在程序开发过程中:打印数据进行查看调试是非常频繁的:如果没有一种易于阅读的样式那是相当痛苦的:先定义一个数组: $array=array( 't0'=>'test0', 't1'=>'te ...

  9. 记录微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function

    微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function 这个报错是在将数组对象通过 ...

  10. layui table动态表头 改变表格头部 重新加载表格

    改变头部原理: 删除原来表格, 重新建立DOM元素, 重新加载table,实现表头改变 明白了原理, 我相信大家都能写出来了, table.reload(ID, options)目前好像还不支持con ...