为什么不要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;
};