代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

测试封闭插座

  •  10
  • Robert S. Barnes Antoni  · 技术社区  · 16 年前

    我试着测试一个关闭的套接字,它已经被对等方优雅地关闭了,而不会导致双重发送的延迟命中,从而导致错误 SIGPIPE

    这里的一个假设是,套接字if closed在最后一次写入/发送之后立即被对等方正常关闭。像过早关闭这样的实际错误将在代码中的其他地方处理。

    如果套接字仍处于打开状态,则会有0个或更多字节的数据,我实际上还不想从套接字缓冲区中取出这些数据。

    我在想我可以打电话给你 int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK); 以确定插座是否仍处于连接状态。如果它连接了,但缓冲区中没有数据,我会得到 -1 具有 errno == EAGAIN 并将sockfd返回以供再次使用。如果它被同伴优雅地关上,我会得到 ret == 0 打开一个新连接。

    我已经测试过了 FIN 我可以得到一个假阳性 EAGAIN 从我的测试中 recv .

    3 回复  |  直到 16 年前
        1
  •  3
  •   Robert S. Barnes Antoni    16 年前

    好的,我又做了一些测试,这就是我发现的。

    我安排我的客户 HTTP/1.1 Connection: close

    我发现大约有30%的时间我的测试会在服务器启动之前进行 FIN 到达导致误报和操作失败。

    所以,我必须得出结论,虽然这个工具是有用的,但它只是一点点。

        2
  •  0
  •   Dean Harding    16 年前

    你能控制另一端吗?执行套接字“干净”关闭的最可靠的方法是让另一端发送某种“再见”消息。

        3
  •  0
  •   Community Mohan Dere    8 年前

    this discussion 可能对你有帮助。它仍然不能回答您的“FIN”问题,但是可以帮助您在程序发送时以更简单的方式对对等机关闭做出反应。

    推荐文章