以下是学习c++ Socket时遇到的一些概念和知识点,收录如下,以便日后查看。概念不会很全,但会随着学习不断完善。。。
MSS与MTU的关系
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。
MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。
分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。
例如:一个以太网上的主机和一个令牌环网上的主机间建立连接,其中以太网上主机通告的MSS为1460,令牌环网上主机通告的MSS为4096。观察分组,在两个方向上都找不到大于1460字节的数据,为什么?
令牌环网上发送到以太网的数据大小不大于1460字节的原因是因为以太网上主要通告的MSS值就为1460个字节,所以令牌环网上发送出去的数据的长度不能够大于MSS值;令牌环网上主机通告的MSS值为4096,也即是说以太网能够发送到令牌环网上的TCP净荷值为4096,但是以太网的MTU值又是由硬件所决定的,最大只支持1500(包括IP头至少20B和TCP头至少20B),为避免分片,因此以太网发送到令牌环网的数据的净荷也为1500-20-20=1460B,所以两个方向的净数据长度不会大于1460字节。
errno
errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。查看错误代码errno是调试程序的一个重要方法。当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。
errno的一些错误定义可在该网址中查找:https://baike.baidu.com/item/errno/11040395?fr=aladdin
size_t
(1)size_t和int
size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与
操作系统
有关。
在32位架构
中被普遍定义为:typedef unsigned int size_t;
而在64位架构
中被定义为:typedef unsigned long size_t;
size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。而int在不同架构下都是4字节
,与size_t不同;且int为带符号数,size_t为无符号数。(2)ssize_t
ssize_t是有符号整型,在32位机器上等同与int,在64位机器上等同与long int.
(3)size_t和ssize_t作用
size_t
一般用来表示一种计数
,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t
,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。
而ssize_t这个数据类型用来表示可以被执行读写操作的数据块的大小
.它和size_t类似,但必需是signed.意即:它表示的是signed size_t类型的。
MSG_PEEK
用于Windows版本中,recv()函数的第四个参数:查看当前数据。数据将被复制到缓冲区中,但并不从输入队列中删除。
常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,而指定了MSG_PEEK标志,可通过返回值获得可读数据长度,并且不会减少套接字接收缓冲区中的数据,所以可以供程序的其他部分继续读取。
另外还有场景如,同一个端口支持文本协议和二进制协议,利用MSG_PEEK看一下头几个字符,先判断是文本协议还是二进制协议,再做请求分发,也是不错的选择。当然,真正的recv之前调用使用MSG_PEEK导致额外的一次函数调用。
同为第四个参数的还有MSG_OOB
: 处理带外数据。
inet_ntoa()
功能:网络字节序IP转化点分十进制IP
参数:IP地址的网络字节序,即网络上的IP地址
返回值:true
,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区(同一线程内共享此内存);false
,返回NULL。
ntohs()
功能:将一个16位数由网络字节顺序转换为主机字节顺序。
返回值:一个以主机字节顺序表达的数。
类似函数:ntohl(),htons(),htonl()
c++ 时间类型详解(time_t和tm)
https://blog.youkuaiyun.com/luoweifu/article/details/20288549
网络教程
https://www.rt-thread.org/document/site/rtthread-tutorial/qemu-network/README/
参考:
1,https://blog.youkuaiyun.com/yygydjkthh/article/details/7359281
2,https://blog.youkuaiyun.com/wc11223/article/details/70553583
3,https://blog.youkuaiyun.com/g1036583997/article/details/49202405
4,recv() 百度百科
5,MSG_PEEK标志
6,inet_ntoa 百度百科
7,inet_ntoa() 百度百科
8,ntohs() 百度百科