在我的应用程序中,我在同一个套接字上调用了两次 shutdown
和 closesocket
函数。我知道这样做是不对的,我必须确保这些函数只被调用一次。但是,为什么这些调用中的任何一个在第二次调用时都不会失败?
如果m_Socket
的句柄是1500
,那么在shutdown
和closesocket
函数时它的值是多少被调用了吗?
shutdown(m_SocServer, 2);
closesocket(m_SocServer);
最佳答案
第一个必须区分两个不同的东西:
- 对套接字执行操作,其中一些操作可能会使其处于不可用状态。
- 终止套接字句柄。
使用参数 2(即 SD_BOTH
)调用 shutdown
是 (1)。也就是说,您刷新所有待处理的输出缓冲区,并丢弃所有接收缓冲区。这样你就不能再读/写了。但是您仍然持有有效的套接字句柄。如果需要,您仍然可以查询/设置其选项。例如,可以对其调用 getpeername
来发现您所连接的地址。
此外,根据实现情况,再次调用 shutdown
不一定会导致错误。也许它具有累积效应。
另一方面,调用 closesocket
是 (2)。一旦你调用它——你不能用那个套接字句柄做任何事情。现在无效了。
如果您的套接字的值为 1500 - 即使在调用 closesocket
之后,它仍将拥有该值。因为它只是一个变量。这就像询问在您 delete
之后指针会有什么值。
但是这个套接字值 (1500) 不再有效。您不能使用此值调用任何套接字函数。
此外,如果您同时创建另一个套接字 - 它很可能会收到相同的号码。在这里您可能会发现自己遇到了一个更严重的问题 - 在没有注意到的情况下在另一个套接字上执行操作。
对于某些人来说,在调用 closesocket
之后立即将 INVALID_SOCKET
值分配给套接字变量是一个很好的做法。
附言
也许调用 shutdown
+ closesocket
不会特别因为您正在关闭另一个套接字而失败。
关于c++ - 在同一个套接字上调用 shutdown 和 closesocket 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3115561/