这里的一个假设是,如果关闭的套接字在最后一次写/发之后立即被对端正常关闭.实际的错误就像过早的关闭一样被处理在代码中的哪里.
如果套接字仍然是打开的,那么将会有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%,就是引入与最后一次读取和尝试的套接字重用之间的连接延迟相关的人为延迟 – 然而,这几乎会导致性能的恶化.
所以,我必须得出结论,虽然这个工具是有用的,但这只是微乎其微.
总结以上是内存溢出为你收集整理的测试一个封闭的插座全部内容,希望文章能够帮你解决测试一个封闭的插座所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)