gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:31:39 25 4
gpt4 key购买 nike

在我的应用程序中,我在同一个套接字上调用了两次 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com