首先对于TCP socket 来说的话 处在receipt阻塞状态 本身就能够对 对方掉线进行一个感知,利用这点机制 我们也可以send 0字节来对连接状态判断,为什么能够感知 ,TCP协议栈底层已经实现了,你可以理解为像单片机处理TTL电平信号那样 操作系统底层已经编了些程序代码实现了。如果你既不进行发送 也不进行接收动作 则是感知不到离线状态的 ,但是一般都会处于一个接收阻塞循环里,所以严格来说是可以不用心跳处理的。然后另一个关于缓冲,TCP stream 本身 就有缓冲机制 这个也是协议栈帮我们实现了 ,并且网络设备还会自动的根据你receipt的处理速度 进行流控。可以看出来这玩意儿高深的很 原来传输层以下还有这么多机制要处理 ,什么三次握手, 并不只是串口那种无脑的根据频率处理电信号 原来协议栈底层帮我们做了这么多事情。而winsocket 只是操作系统暴露给我们的一个协议栈 数据流接口而已 ,这是传输层的 然后我们的一切工作都基于其之上,就像学校老师教的 他这种接口的方式 也并不是面向对象的 更形象点来说的话 类似打电话或者 管道水流 处理。一般情况下我们只需要简易处理粘包,无需管缓存 和数据断包 甚至无需校验 无需管数据错乱,因为TCP已经实现了数据完整性保证机制。 然后我们只需在之上构建业务即可。
前面谈论了TCP 。最明显的区别也是常识 以前电脑上玩棋牌游戏 或者qq传文件的时候 我们可以把网线拔掉 等几秒钟甚至十秒钟再插上 ,程序整个交互过程不会受任何影响,对比一下串口,由于串口是及时性的波特率在那管着的 你保持我这个频率动作自然就能够收到,数据在你的单片机寄存器里就待那么0.001秒的时间 ,如果你单片机运行频率如果低于 那毫无疑问是取不到的,或者你单片机取到了非要用冗长的处理代码干别的那后面的数据丢了我也管不着,对比一下TCP 这不就是ttl电讯号吗 就是原始人啊 啥串口不串口。但是对比一下TCP 最主要的两点 也只是 加了 数据缓冲 和数据完整性保障。想象一下你自己是一台电脑 网卡的底层那几根儿金属线跟串口有啥区别 说实话没任何区别 网卡底层照串口处理TTL电信号一样处理自己的,只不过low逼的串口到这就结了,TCP则以socket接口为界限 对收到的电信号进行了包装(这个属于网卡固件 或者操作系统系统级提供我们就不去掰扯它了哈,你可以单片机4个IO口 加上 移植LWIP 固件 按照国际通行惯例 处理握手 缓冲 且不说包装成跟socketAPI一样 ,能跟其他TCP互通就成功了一半了,这不就是基于串口电讯号做了一张网卡么)这样基于socketAPI提供给我们应用程序的就是一个非常现代化的东西了 众所周知的 最基本的就有了 数据完整性保障 和数据缓冲 特性。
由此可理解 socket是操作系统暴露的 API ,以及TCP在操作系统层面的底层固件 自动处理握手确保数据收发成功 缓冲, 以及与操作系统嵌合 通过socket暴露给传输层使用 这句意味深长的话了吧。
看了很多的单片机串口代码写的都是非常的普通的不能再普通了,直到看到了手持表的FIFO双指针缓冲读取技术(相对于纯软件层看到的 有了缓冲) ,然后再加上freertos本身提供的互斥量管控(软件层见到的仅仅是一个清晰的统一API的IO调用 也可以多线程。底层确对硬件IO资源进行了管控调度排队处理 随便你上层咋个乱调用 我底层只有两根电线 频率只有那么高),不是low逼串口么 ,怎么回事,怎么样感觉画风是不是有点变了 有那么一点点操作系统底层LWIP固件的影子了,世界的运转机制是如此的相像。