在同一个套接字上调用shutdown和closetsocket两次
在我的应用程序中,我在同一套接字上调用shutdown
和closesocket
两次函数。我知道这是不对的,我必须确保这些功能只被调用一次。但是为什么这些通话在第二次通话时都不会失败?在同一个套接字上调用shutdown和closetsocket两次
如果m_Socket
手柄1500
,然后将它的值是什么时,shutdown
和closesocket
函数的调用就可以了?
shutdown(m_SocServer, 2);
closesocket(m_SocServer);
首先,你必须区分两种不同的东西:一个插座上
- 执行操作,其中一些可能使其在无法使用的状态。
- 终止插座手柄。
调用参数为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
,你不关闭你的原始套接字,但重新开放的一个