通常我们调用closesocket关闭套接字,套接字的关闭过程,有以下三种情况:
1、取消没有进行的发送操作,系统在后台发起一个关闭过程,向对等方发送FIN报文,并等待对等方的FIN报文。整个关闭过程不会产生任何的事件(WSAEventSelect)和消息(WSAAsyncSelect)。
2、直接释放占用的系统资源,没有向对等方发送任何的数据,也不会发送缓冲队列的数据;
3、等待一段时间,如果能够在指定时间内将未发送的数据发送出去,那么会在后台发起一个关闭过程;如果不能够在指定时间内发送完数据,则立即释放资源,也不会向对等方发送数据。这种情况的关闭过程同样不会产生事件和消息。
新建套接字,调用closesocket的默认行为是第一种情况。可以通过setsockopt修改默认行为,具体的设置参见MSDN对SO_LINGER, SO_DONTLINGER。