3.1C++学习之-socket(TCP)

本文详细介绍了TCP Socket的工作原理,包括输入输出缓冲区的作用、默认大小及获取方法;探讨了TCP协议如何独立于write()/send()函数进行数据发送,并解释了TCP的黏包特性。此外还对比了close()/closesocket()与shutdown()的区别,以及不同CPU架构下数据保存方式和网络字节序的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Socket被创建后(这里先是指TCP)。都会分配两个缓存区,一个输入缓存区,一个输出缓存区。write()和send()并不是立即向网络中传输数据,二叔先把数据写到缓存区。写进去,函数就返回成功了,什么时候发,都是TCP协议负责的事情。

TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。

输入输出缓冲区的默认大小一般都是 8K,可以通过 getsockopt() 函数获取:

TCP有黏包的特性

默认情况下,close()/closesocket() 会立即向网络中发送FIN包,不管输出缓冲区中是否还有数据,而shutdown() 会等输出缓冲区中的数据传输完毕再发送FIN包。也就意味着,调用 close()/closesocket() 将丢失输出缓冲区中的数据,而调用 shutdown() 不会。

CPU向内存保存数据的方式有两种:
大端序(Big Endian):高位字节存放到低位地址(高位字节在前)。
小端序(Little Endian):高位字节存放到高位地址(低位字节在前)。

图来自http://c.biancheng.net/cpp/html/3047.html

不同CPU保存和解析数据的方式不同(主流的Intel系列CPU为小端序),小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序(Network Byte Order)。网络字节序统一为大端序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值