gpt4 book ai didi

c - 测试关闭的套接字

转载 作者:可可西里 更新时间:2023-11-01 02:30:32 25 4
gpt4 key购买 nike

我正在尝试测试一个已关闭的套接字,该套接字已被对等方正常关闭,而不会导致双重发送的延迟命中以引发 SIGPIPE

这里的一个假设是,如果套接字关闭,它在最后一次写入/发送后立即被对等方优雅地关闭。过早关闭等实际错误在代码中的其他地方处理。

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

我想我可以调用 int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK); 来确定套接字是否仍然连接。如果它已连接但缓冲区中没有数据,我将返回 -1errno == EAGAIN 并返回 sockfd 以供重用。如果它已被对等方正常关闭,我将得到 ret == 0 并打开一个新连接。

我已经测试过了,它似乎有效。但是,我怀疑在我接收数据的最后一位和对等方 FIN 到达之间有一个小窗口,我可以从中得到误报 EAGAIN我的测试recv

这会影响我,还是有更好的方法?

最佳答案

好的,所以我又进行了一些测试,这就是我的发现。

我将客户端设置为向服务器发送 HTTP/1.1 Connection: close 消息,导致服务器在最后一次写入数据后调用关闭。当我的客户端完成从 GET 事务中读取数据时,它会使用上述方法测试套接字以查看它是否仍处于打开状态,然后尝试发出另一个 GET。

我发现大约 30% 的时间我的测试发生在服务器的 FIN 到达之前,导致误报和操作失败。

可能使这一点合理可靠的唯一方法,比如说接近 99% 的方法是在上次读取和尝试套接字重用之间引入与连接延迟相关的人为延迟 - 然而,这几乎会扼杀性能。

因此,我不得不得出结论,虽然此工具很有用,但作用不大。

关于c - 测试关闭的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441928/

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