测试一个封闭的插座

我试图测试一个已经被对端正常关闭的封闭套接字,而不会引起双重发送的延迟命中,从而诱发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%,就是引入与最后一次读取和尝试的套接字重用之间的连接延迟相关的人为延迟 – 然而,这几乎会导致性能的恶化.

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...