在同一个套接字上调用shutdown和closetsocket两次

问题描述:

在我的应用程序中,我在同一套接字上调用shutdownclosesocket两次函数。我知道这是不对的,我必须确保这些功能只被调用一次。但是为什么这些通话在第二次通话时都不会失败?在同一个套接字上调用shutdown和closetsocket两次

如果m_Socket手柄1500,然后将它的值是什么时,shutdownclosesocket函数的调用就可以了?

shutdown(m_SocServer, 2); 
closesocket(m_SocServer); 

首先,你必须区分两种不同的东西:一个插座上

  1. 执行操作,其中一些可能使其在无法使用的状态。
  2. 终止插座手柄。

调用参数为shutdown(即SD_BOTH)为(1)。也就是说,你刷新所有挂起的缓冲区,并放弃所有的接收缓冲区。这样你就不能读/写了。但是你仍然拥有一个有效的套接字句柄。如果你愿意,你仍然可以查询/设置它的选项。例如,您可以拨打getpeername来发现您连接的地址。 另外,根据实施情况,再次调用shutdown不必导致错误。也许它有累积效应。

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

如果套接字的值为1500,即使在致电closesocket后,它仍然具有该值。因为它只是一个变量。这就像是在你delete之后问什么值会有指针。

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

此外,如果您同时创建另一个套接字 - 它很可能会收到相同的数字。在这里,您可能会发现自己处于更严重的问题 - 在另一个套接字上执行操作而不会注意到它。

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

P.S. 也许调用shutdown + closesocket不会因为您关闭另一个套接字而特别失败。

他们确实失败。尝试下面的代码片段。

SOCKET s = socket(AF_INET, SOCK_STREAM, 0); 
closesocket(s); // OK 

shutdown(s, 2); // fails 
closesocket(s); // fails 

无论你得到一个错误或者不调用closesocket后的第一时间取决于你的代码的其余部分正在做什么。

一旦你呼叫closesocket,该套接字标识符是空闲的,并且可以通过对socket的另一个调用再次返回。如果你再打电话closesocket,你不关闭你的原始套接字,但重新开放的一个