SO_LINGER: setSoLinger(boolean on, int val)
主要用于影响调用SOCKET关闭动作,val的单位在java里是百分之一秒
A. 当设置为setSoLinger(true, 0)时,关闭socket,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是正常的四分组终止序列,这避免了TIME_WAIT状态,处于TIME_WAIT状态的端口是不会释放的,如果要重用这些端口可以在连接前,调用setReuseAddress(true)可设置端口重用。出现TIME_WAIT的原因是:A向B发送FIN包,B回复ACK确认,然后B向A发送FIN包,接着A向B发送ACK确认,之后A就进入TIME_WAIT状态,待过了2msl(大概1~4分钟)后,TIME_WAIT就会消失,如果想缩短该时间,需要修改windows注册表,或linux内核网络参数达到该目的,如设置为30秒
windows下修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的DWORD键值
linux下修改/etc/sysctl.conf,然后执行/sbin/sysctl -p 使修改生效,修改的信息如下:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
(网络来源:http://blog.chinaunix.net/u3/93926/showart_1873546.html)
B. 当设置为setSoLinger(true, xxx)时,,关闭socket将被阻塞,直到TCP将等待缓冲区中的数据发送完毕或出现超时
C. setSoLinger(false, xxx),关闭socket立刻关闭,缺省是该值(我还没确定是发送一个RST给对方,还是是正常的四分组终止序列)
SO_TIMEOUT:在调用socket相关的具有阻塞特性的方法前设置,可以控制阻塞超时,一般使用在数据接收读取时,如多久没接收读取到远程发送过来的数据,出现超时。