c++ Socket学习——概念(完善中。。。)

本文介绍了C++ Socket编程中的关键概念,包括MSS与MTU的关系、errno的错误代码、size_t和ssize_t的用途,以及MSG_PEEK、inet_ntoa()和ntohs()函数的用法。通过学习,读者可以更好地理解Socket编程中的网络通信细节。

以下是学习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() 百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值