在我的应用程序中,我在同一个套接字上调用了两次shutdown和closesocket函数。我知道这不是正确的做法,我必须确保这些函数只被调用一次。但是为什么这些调用在第二次调用时都不会失败呢?
如果m_Socket的句柄是1500,那么当对它调用shutdown和closesocket函数时,它的值是什么?
shutdown(m_SocServer, 2);
closesocket(m_SocServer);发布于 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不会失败,特别是因为您正在关闭另一个套接字。
发布于 2010-06-25 14:23:04
第一次调用closesocket后是否出现错误取决于代码的其余部分所做的工作。
一旦调用closesocket,该套接字标识符就是空闲的,并且可以由另一个对socket的调用再次返回。如果再次调用closesocket,则不是关闭原始套接字,而是关闭新重新打开的套接字
发布于 2010-06-25 14:15:59
他们确实失败了。尝试跟随代码片段。
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
closesocket(s); // OK
shutdown(s, 2); // fails
closesocket(s); // failshttps://stackoverflow.com/questions/3115561
复制相似问题