TCP套接口的缓冲区

《unix网络编程》 Page42
每一个 TCP 套接口有一个发送缓冲区,我们可以用 SO_SNDBUF 套接口选项来改变这一缓冲区的大小。当应用进程调用 write 时,内核从应用进程的缓冲区中 copy 所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用进程的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,这是通常的缺省设置。

Page161
客户可以设置 SO_LINGER 套接口选项,指定一个正的延滞时间。这种情况下,客户的 close 要直到它的数据和 FIN 已被 TCP 服务器确认后才返回。但我们仍有问题:在服务器应用进程读剩余数据之前,服务器主机可能崩溃,并且客户应用进程永远不会知道。
这里有一个基本原则:设置 SO_LINGER 套接口选项后,close 的成功返回仅告诉我们发送的数据(和 FIN)已由对方 TCP 确认,它并不能告诉我们对方应用进程是否已读了数据。如果不设置该选项,我们连对方 TCP 是否确认了数据都不知道。
让客户直到服务器已读取其数据的一个方法是:调用 shutdown (第二个参数设置为 SHUTWR )而不是调用 close,并等待对方 close 连接的本地(服务器)端。

Page162
获知对方应用进程已读我们的数据的另外一个方法是:使用一个应用级的确认(application-level acknowledge) 即应用 ACK (application ACK)。例如,客户端给服务器发数据后,调用 read 来读 1 个字节的数据。

Page338
对于一个非阻塞 TCP 套接口,如果在套接口的发送缓冲区中没有空间,输出操作会立即返回一个 EWOULDBLOCK 错误。如果发送缓冲区中有一些空间,返回值为内核能向缓冲区 copy 的字节数。(这叫做不足计数(short count)。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值