首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >socket.shutdown vs socket.close

socket.shutdown vs socket.close
EN

Stack Overflow用户
提问于 2009-01-03 20:37:55
回答 7查看 193.1K关注 0票数 146

我最近看到了一些类似这样的代码(当然,sock是一个套接字对象):

代码语言:javascript
复制
sock.shutdown(socket.SHUT_RDWR)
sock.close()

在套接字上调用shutdown然后关闭它的目的到底是什么?如果有所不同,则此套接字用于非阻塞IO。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-01-03 21:10:08

这里有一个explanation

一旦不再需要套接字,调用程序就可以通过对套接字描述符应用Close子例程来丢弃该套接字。如果发生关闭时可靠传递套接字具有与其关联的数据,系统将继续尝试数据传输。但是,如果数据仍未传递,系统将丢弃该数据。如果应用程序不使用任何挂起的数据,它可以在关闭套接字之前使用套接字上的shutdown子例程。

票数 49
EN

Stack Overflow用户

发布于 2009-02-28 21:58:06

调用closeshutdown对底层套接字有两种不同的影响。

首先要指出的是,套接字是底层OS中的一种资源,多个进程可以拥有同一底层套接字的句柄。

当您调用close时,它会将句柄计数减1,如果句柄计数已达到0,则套接字和相关连接将经历正常的关闭过程(有效地向对等设备发送FIN / EOF ),并释放套接字。

这里要注意的是,如果句柄计数没有达到零,因为另一个进程仍然拥有套接字的句柄,则连接不会关闭,套接字也不会被释放。

另一方面,调用shutdown进行读写会关闭底层连接,并向对等体发送FIN / EOF,而不管有多少进程拥有套接字的句柄。但是,它关闭不释放套接字,并且您仍然需要在之后调用。

票数 272
EN

Stack Overflow用户

发布于 2009-01-04 01:28:30

shutdown和close的说明:Graceful shutdown (msdn)

Shutdown (在您的情况下)向连接的另一端指示不再打算从套接字读取或写入套接字。然后,close释放与套接字关联的所有内存。

忽略关闭可能会导致套接字在OSs堆栈中逗留,直到连接正常关闭。

在我看来,“关闭”和“关闭”这两个名称具有误导性,“关闭”和“销毁”会强调它们之间的区别。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/409783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档