shutdown (windows)

shutdown

关闭socket的读或者写。

当关闭读的时候how=SD_RECEIVE,后续的读操作将会被禁止。调用后对于底层的tcp栈没有任何影响。假如在关闭读后,tcp的读缓冲区仍旧有数据未被应用读取,或者还有新的数据过来,那么底层tcp栈会发送rst来重置连接。

当关闭写的时候how=SD_SEND,后续的写操作将会被禁止。当写缓冲区所有的数据被发送并被接收方确认后,fin将会被发送,进入FIN_WAIT1状态。

shutdown不会真正的关闭并释放socket,必须使用closesocket来关闭和释放。

下面有几种情况会造成rst重置:

1.读方的缓冲区中还有数据,直接closesocket或者shutdown with SD_RECEIVE,那么将会直接给对方一个rst。

2.连接上了某个主机的未监听端口,那么在syn包发送后,假设该主机的backlog未满,即该syn没有被丢弃,那么该主机会直接给连接方一个rst。

3.向一个已废弃的连接发送数据,那么对方将发rst。这种情况主要是在连接已成功建立后(A->B),A断电了,由于A无法发送fin或者rst,同时B的keepalive还没有检测到连接的僵死,B后续又向该socket发送了数据,A在接受后,发现没有对应的连接信息,于是直接发送rst。

closesocket是真正的销毁了socket对象,在调用该函数之后,所有针对于此的recv、send将会报错;而shutdown则不会真正的销毁该对象,可以继续使用该socket来接收或者传输数据包。

共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day