为什么不要send完后立即close

send完后立即close就是不安全的,无论是服务器端还是客户端。

send操作成功只是表示数据成功地写入到操作系统socket缓存区,不代表对端真的接收到了数据。究竟操作系统有没有发送成功,对方服务器是否收到,服务器端程序是否处理,都不没办法确切保证。

close后的逻辑请看下面的linger设置相关

这个逻辑和电话沟通是一个道理,A告诉B一个事情,A说完了就挂掉电话。那么B听到没有,A是不知道的。如果A说完事情,B说好,然后B挂掉电话,就绝对是安全的。

linger设置

一个socket在close时,如果发送缓冲区仍然有数据,操作系统底层会根据linger设置决定如何处理

struct linger
{
     int l_onoff;
     int l_linger;
};