首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一套接字上调用shutdown和closesocket两次

在同一套接字上调用shutdown和closesocket两次
EN

Stack Overflow用户
提问于 2010-06-25 12:34:45
回答 3查看 8.1K关注 0票数 2

在我的应用程序中,我在同一个套接字上调用了两次shutdownclosesocket函数。我知道这不是正确的做法,我必须确保这些函数只被调用一次。但是为什么这些调用在第二次调用时都不会失败呢?

如果m_Socket的句柄是1500,那么当对它调用shutdownclosesocket函数时,它的值是什么?

代码语言:javascript
复制
shutdown(m_SocServer, 2);
closesocket(m_SocServer);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-25 15:10:42

首先,必须区分两个不同的东西:

在套接字上执行操作,其中一些操作可能会使套接字句柄无法使用。

使用参数2(即SD_BOTH)调用shutdown是(1)。也就是说,您刷新所有挂起的输出缓冲区,并丢弃所有接收缓冲区。这样你就不能再读/写了。但是,您仍然持有有效的套接字句柄。如果需要,您仍然可以查询/设置其选项。例如,可以在它上调用getpeername来发现您连接到的地址。此外,根据实现的不同,再次调用shutdown不一定会导致错误。也许它有一种累积效应。

另一方面,调用closesocket是(2)。一旦你调用了它,你就不能对这个套接字句柄做任何事情了。它现在是无效的。

如果你的socket的值是1500 -它仍然会有它,即使在调用了closesocket之后。因为它只是一个变量。这就像是问指针在你delete之后会有什么值。

但是,此套接字值(1500)不再有效。您不能使用此值调用任何套接字函数。

此外,如果您同时创建另一个套接字-它很可能会收到相同的数字。在这里,你可能会发现自己遇到了一个更严重的问题--在没有注意到的情况下对另一个套接字执行操作。

对于某些人来说,在调用closesocket之后立即将INVALID_SOCKET值赋给套接字变量是一种很好的做法。

附注:也许调用shutdown + closesocket不会失败,特别是因为您正在关闭另一个套接字。

票数 7
EN

Stack Overflow用户

发布于 2010-06-25 14:23:04

第一次调用closesocket后是否出现错误取决于代码的其余部分所做的工作。

一旦调用closesocket,该套接字标识符就是空闲的,并且可以由另一个对socket的调用再次返回。如果再次调用closesocket,则不是关闭原始套接字,而是关闭新重新打开的套接字

票数 5
EN

Stack Overflow用户

发布于 2010-06-25 14:15:59

他们确实失败了。尝试跟随代码片段。

代码语言:javascript
复制
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
closesocket(s);   // OK

shutdown(s, 2);   // fails
closesocket(s);   // fails
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3115561

复制
相关文章

相似问题

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