代码之家  ›  专栏  ›  技术社区  ›  ckv

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

  •  2
  • ckv  · 技术社区  · 14 年前

    在我的应用程序中,我调用 shutdown closesocket 在同一个插座上运行两次。我知道这样做是不对的,我必须确保这些函数只被调用一次。但是为什么在第二次调用时这两个调用都不会失败呢?

    m_Socket 1500 ,那么它的价值是什么 关闭 关闭连接 函数被调用了吗?

    shutdown(m_SocServer, 2);
    closesocket(m_SocServer);
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   valdo    14 年前

    1. 终止套接字句柄。

    shutdown SD_BOTH )是(1)。也就是说,清除所有挂起的out缓冲区,再丢弃所有接收缓冲区。这样你就不能再读/写了。但是,您仍然持有有效的套接字句柄。如果需要,您仍然可以查询/设置其选项。例如,你可以打电话 getpeername 关闭 也不一定会导致错误。可能有累积效应。

    另一方面 closesocket

    如果套接字的值为1500,则即使调用 . 因为它只是一个变量。这就像问指针在你后面的值是什么 delete 是的。

    此外,如果您同时创建另一个套接字,它很可能会收到相同的号码。在这里,您可能会发现自己遇到更严重的问题—在另一个套接字上执行操作时没有注意到它。

    对有些人来说,这是一个很好的做法 INVALID_SOCKET 调用后立即将值转换为套接字变量 关闭连接 在上面。

    附笔。 关闭 + 关闭连接

        2
  •  5
  •   R Samuel Klatchko    14 年前

    无论你打电话后是否出错 closesocket 第一次取决于代码的其他部分在做什么。

    一旦你打电话 关闭连接 socket . 如果你打电话 关闭连接 同样,您没有关闭原来的套接字,而是新打开的套接字

        3
  •  1
  •   avakar    14 年前

    他们确实失败了。尝试删除以下代码段。

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