首页 理论教育ARM嵌入式系统原理与应用-socket缓冲区

ARM嵌入式系统原理与应用-socket缓冲区

【摘要】:图8.4socket套接字发送、接收数据示意图2.套接字缓冲区的特性◆缓冲区在每个TCP套接字中单独存在;◆I/O缓冲区在创建套接字时自动生成;◆即使关闭套接字也会继续传送输出缓冲区中遗留的数据;◆关闭套接字将丢失输入缓冲区中的数据。

1.socket缓冲区

网络数据发送和接收与串口的发送、接收较为相似。发送函数只是把数据写入套接字缓冲区中,而不是直接把数据传输到网络,发送缓冲区中的数据由TCP协议发送到目标机器。只要将数据写入到缓冲区,函数就可以成功返回,接下来数据如何传输、何时传输都是TCP协议负责的事情。

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

网络接收函数也是如此,从套接字接收缓冲区中读取数据,而不是直接从网络中读取。网络数据发送、接收如图8.4所示。

图8.4 socket套接字发送、接收数据示意图

2.套接字缓冲区的特性

◆缓冲区在每个TCP套接字中单独存在;

◆I/O缓冲区在创建套接字时自动生成;

◆即使关闭套接字也会继续传送输出缓冲区中遗留的数据;(www.chuimin.cn)

◆关闭套接字将丢失输入缓冲区中的数据。

3.缓冲区大小的设置

套接字发送、接收缓冲区的默认大小一般都是8K,可以通过getsockopt()函数获取,当然可通过调整缓冲区的大小去影响通信的性能。设置发送缓冲区大小的方法如下:

Int val=256;

Setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,(void∗)&val,sizeof(val));

设置接收缓冲区大小的方法如下:

Int val=128;

Setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,(void∗)&val,sizeof(val));

设置的缓冲区大小会被内核加倍,上述设置中发送缓冲区的实际大小为512个字节,接收缓冲区的实际大小为256个字节。