微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

测试一个封闭的插座

我试图测试一个已经被对端正常关闭的封闭套接字,而不会引起双重发送的延迟命中,从而诱发SIGPIPE.

这里的一个假设是,如果关闭套接字在最后一次写/发之后立即被对端正常关闭.实际的错误就像过早的关闭一样被处理在代码中的哪里.

如果套接字仍然是打开的,那么将会有0个或更多的字节数据,我实际上并不想从套接字缓冲区中拉出来.

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

我已经测试了,似乎工作.但是,我怀疑当我记录最后一点数据时,当对等体FIN到达时,我可以从我的测试recv得到一个假阳性的EAGAIN.

这是否会咬我,还是有更好的做法?

解决方法

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

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

我发现,大约30%的时间我的测试将发生在服务器的FIN到达之前导致假阳性和失败的操作.

可能使这种可靠性最好的方法就是接近99%,就是引入与最后一次读取和尝试的套接字重用之间的连接延迟相关的人为延迟 – 然而,这几乎会导致性能的恶化.

所以,我必须得出结论,虽然这个工具是有用的,但这只是微乎其微.

原文地址:https://www.jb51.cc/c/115210.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐