c++ - 在同一个套接字上调用 shutdown 和 closesocket 两次

标签 c++ winapi winsock

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

如果m_Socket的句柄是1500,那么在shutdownclosesocket函数时它的值是多少被调用了吗?

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

最佳答案

第一个必须区分两个不同的东西:

  1. 对套接字执行操作,其中一些操作可能会使其处于不可用状态。
  2. 终止套接字句柄。

使用参数 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/

相关文章:

C++ Winsock 套接字错误 : 10038 (WSAENOTSOCK)

c++ - 使用 C++ 在 Windows 中进行线程化

c++ - 您使用哪些 Windows 日志记录工具?

c++ - 在 C++ 标准中,哪里声明了 const 右值引用不绑定(bind)到左值?

异常后Java套接字无法使用

c++ - 在整个硬盘中查找文件

c - 格式化消息不起作用

c++ - 有什么方法可以将 << 运算符与 stringstream 和带空格的字符串一起使用?

c++ - 无法使 boost::asio 简单同步服务器教程程序正常工作——连接被拒绝

c - Windows API 是面向对象的框架吗?