小记

这里淘到一篇讲Socket的博客:
https://www.jianshu.com/p/066d99da7cbd
这一篇也不错:https://www.cnblogs.com/hissia/p/5730135.html

简单梳理一下:

什么是Socket

一张图让你知道Socket在哪里用到:

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

它是计算机之间进行通信的一种约定或一种方式。
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。
  我的理解就是Socket就是该模式的一个实现:即socket是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
  Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

网络通讯

网络通讯中如何标识主机唯一

TCP/IP协议已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机

网络通讯中如何标识进程唯一

传输层协议+端口可以唯一标识主机中的应用程序(进程),因此,我们利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

Socket通讯两种方式
  • SOCK_STREAM:表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
  • SOCK_DGRAM:表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。
      例如:QQ 视频聊天和语音聊天就使用 SOCK_DGRAM 传输数据,因为首先要保证通信的效率,尽量减小延迟,而数据的正确性是次要的,即使丢失很小的一部分数据,视频和音频也可以正常解析,最多出现噪点或杂音,不会对通信质量有实质的影响

这里跟TCP、UDP很像

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。

Socket常用函数接口及其原理

tcpscoket实现图解:

udpscoket图解:

socket调用库函数主要有:创建套接字 Socket(af,type,protocol)建立地址和套接字的联系 bind(sockid, local addr, addrlen)服务器端侦听客户端的请求 listen( Sockid ,quenlen)建立服务器/客户端的连接 (面向连接TCP) 客户端请求连接 Connect(sockid, destaddr, addrlen)服务器端等待从编号为Sockid的Socket上接收客户连接请求 newsockid=accept(Sockid,Clientaddr, paddrlen)发送/接收数据 面向连接:send(sockid, buff, bufflen) recv( )面向无连接:sendto(sockid,buff,…,addrlen) recvfrom( )释放套接字 close(sockid)

具体内容还是需要去看上面的博客

TcpSocket和UdpSocket

Tcp:
服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,然后调用listen在相应的socket上监听,当accpet接收到一个连接服务请求时,将生成一个新的socket。服务器显示该客户机的IP地址,并通过新的socket向客户端发送字符串" hi,I am server!"。最后关闭该socket。

客户端的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,请求连接服务器,通过新的socket向客户端发送字符串" hi,I am client!"。最后关闭该socket。

Udp:
服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,接收到一个客户端时,服务器显示该客户端的IP地址,并将字串返回给客户端。

客户端的工作流程:首先调用socket函数创建一个Socket,填写服务器地址及端口号,从标准输入设备中取得字符串,将字符串传送给服务器端,并接收服务器端返回的字符串。最后关闭该socket。

笔记

C 枚举

在C语言中,枚举是之中基本数据类型
枚举格式:

enum 枚举名 {枚举元素1,枚举元素2,……};

实例:
假如一周有七天,不用枚举定义如下:

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7

使用枚举定义如下:

enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};

注意:
第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

enum season {spring, summer=3, autumn, winter};

在这个例子中 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5

枚举实例
    enum day{saturday=1,sunday,monday,tuesday,wednesday,thursday,friday};int week;printf("week:");scanf("%d", &week);switch (week){case saturday:printf("saturday");break;case sunday:printf("sunday");break;}


注意:
应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

单精度和双精度

单精度:float
双精度:double
在32位系统中,float占4个字节,double占8个字节。

    float a=1.1;double b=1.1;printf("float_length:%d",sizeof(a));printf("\n");printf("double_length:%d",sizeof(b));printf("\n");


双精度精确度高,可以精确到小数点后15位有效数,单精度只能精确到7位

定点数和浮点数

定点数:
小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精(Precision)小数点后有两位的货币值。
浮点数:
用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果。

MQTT协议

MQTT协议是干嘛的

MQTT教程:https://www.runoob.com/w3cnote/mqtt-intro.html

自己梳理一下:

MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。

MQTT是应用层的协议。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器的通信协议。

MQTT和TCP、WebSocket的关系可以用下图一目了然:

MQTT协议专注于网络、资源受限环境,建立之初不曾考虑WEB环境。HTML5 Websocket是建立在TCP基础上的双通道通信,和TCP通信方式很类似,适用于WEB浏览器环境。虽然MQTT基因层面选择了TCP作为通信通道,但我们添加个编解码方式,MQTT over Websocket也可以的。这样做的好处,MQTT的使用范畴被扩展到HTML5、桌面端浏览器、移动端WebApp、Hybrid等,多了一些想像空间。这样看来,无论是移动端,还是WEB端,MQTT都会有自己的使用空间。

MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT实现

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。qos=0

“至少一次”,确保消息到达,但消息重复可能会发生。qos=1

“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。qos=2

Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT协议数据包结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:

  • 固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
  • 可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
  • 消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。

具体还是要看上述博客中

实习日记(5-18)Socket与MQTT相关推荐

  1. 财务管理计算机实验日志5天,关于财务管理的实习日记范文

    关于财务管理的实习日记范文 今天是我实习的天,来到学校的财务管理办公室刚开始我只能在旁边看,会计师做各种会计报表,原始凭证,财务报告,编制财务报告,核对现金日记账.银行存款,日记账与总帐余额是否相符等 ...

  2. 实习日记(三):mRASPmRASP2中的RAS及AA源码解读

    往期回顾 实习日记(一):多语言机器翻译mRASP与mRASP2的那些事儿~ 实习日记(二):序列建模工具包--Fairseq 感谢篇:   十分感谢外研在线技术中心算法团队各位老师在我实习期间给予的 ...

  3. css碎步测量,隧洞测量实习日记.doc

    隧洞测量实习日记 隧洞测量实习日记 篇一:隧道施工测量实习日记1 今天是我来到中遂股份合福高铁闽赣段七工区的第一天,是把自己所学的理论知识用到实践中来的时候了,很开心!这一天单位上的所有人对我的到来表 ...

  4. 计算机网络维护日记,计算机网络维护实习日记.doc

    计算机网络维护实习日记.doc (11页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 videoconference, Secreta ...

  5. 实习日记——Day2

    今天上午学校有考试,所以我是考完试,中午匆匆赶到公司的.因为下午给我安排了两位前辈的培训. 今天的收获和思考有: 1.准时下班没有错! 今天下班时就没昨天那么纠结该不该走了.因为我发现单独坐在角落的我 ...

  6. 计算机教师教学日记,计算机教师实习日记30篇.doc

    计算机教师实习日记30篇 there? After ignition, combustion should focus its attention on what? Reducing boiler h ...

  7. 计算机程序工作日志,计算机程序员实习日记大全

    Ctrl+D收藏本站,我们将第一时间为大家提供更多关于2014年实习报告的信息,敬请期待! 点击查看:实习报告网 计算机程序员实习日记大全 2014-05-14 星期一 ListCtrl中LVITEM ...

  8. 2021深圳实习日记

    2021.1.14深圳实习日记 正经人写日记么,这我不清楚.我今天看了一个博主发的帖子,讲的是做博客的经历.我看完很有感触,我呢是一个菜鸟,刚混迹于社会上,还没立足.今年疫情导致我们学校校招推迟到年底 ...

  9. 计算机绘图实训日志通用篇,cad制图实习日记范文:

    cad制图实习过程中,我们要抓住每一个可以学习的机会.小编给大家推荐一下cad制图实习日记范文,希望大家会喜欢! cad制图实习日记范文篇1 这两天都在联系cad,毕竟是基础嘛,一定要扎实了.我从做建 ...

  10. css碎步测量,饮水隧洞测量实习日记.doc

    饮水隧洞测量实习日记 饮水隧洞测量实习日记 篇一:工程测量实习日记 实习日记 2016年8月22日 错过了一个暑假,重新开始测量实习的第一天,一大早起床,在领过仪器,检查过仪器以后,我们一起开了个简短 ...

最新文章

  1. ASP.NET服务器控件开发(2)--继承WebControl类
  2. The Best Vacation CodeForces - 1358D(贪心+尺取)
  3. 海报样机模型|让设计作品从人群中脱颖而出
  4. 两条信号之间加电容_电容是什么?怎么用?怎么买?
  5. 云盘存储 教学反思_现代教育技术
  6. python model如何获取分类错误的数据_如何用python获取美股数据?
  7. 推荐:年度巨献:《Ubuntu桌面生存指南》(作者:ghosert)
  8. Unity配置JAVA环境变量
  9. Windows/Mac上免费好用的压缩软件推荐(持续更新)
  10. JS输入银行卡号,4位自动加空格 ,根据银行卡号获取开户行和银行
  11. Java基础案例教程_Java基础案例教程答案
  12. 2021工作总结, 展望2022
  13. 左室短轴切面_心脏超声常用切面与解剖.pptx
  14. 【高德地图POI踩坑】AMap.PlaceSearch无法使用
  15. JZOJ 3859.【NOIP2014八校联考第3场第2试10.5】孤独一生(sprung)
  16. (转)Android屏幕适配全攻略
  17. mini2440中nand falsh的使用
  18. 爬虫 | 王者荣耀高清壁纸-单线程
  19. jsp第三方小额支付平台
  20. 应用统计学与R语言实现学习笔记(三)——描述性统计

热门文章

  1. python抓取免费ip存入redis
  2. (遇到问题)占用空间远大于文件本身---exFAT移动固态硬盘瞬间装满(已解决-文件系统和默认簇大小的原因)
  3. 硅基生命之漫谈-2:宇宙之基本法则:聚合与分解?
  4. 成功在于实践作文_成功源于行动作文800字
  5. 做完系统回来计算机连接不上网络,电脑重装系统后网络连接不上怎么处理
  6. SAP的月结相关流程介绍
  7. 什么是X window
  8. 疫情中的日本东京it工作
  9. 特殊教育学校计算机教学计划,特教学校教学工作计划(精选3篇)
  10. 【HTCVR】VRTK插件模块功能分析之传送移动(二)