我试图测试一个已经被对端正常关闭的封闭套接字,而不会引起双重发送的延迟命中,从而诱发SIGPIPE.
这里的一个假设是,如果关闭的套接字在最后一次写/发之后立即被对端正常关闭.实际的错误就像过早的关闭一样被处理在代码中的哪里.
如果套接字仍然是打开的,那么将会有0个或更多的字节数据,我实际上并不想从套接字缓冲区中拉出来.
我在想我可以调用int ret = recv(sockfd,buf,1,MSG_DONTWAIT | MSG_PEEK);以确定套接字是否仍然连接.如果它是连接的,但缓冲区中没有数据,我将返回-1与errno == EAGAIN返回,并返回sockfd重新使用.如果它被对等体正常关闭,我将获得== ==并打开一个新的连接.
我已经测试了,似乎工作.但是,我怀疑当我记录最后一点数据时,当对等体FIN到达时,我可以从我的测试recv得到一个假阳性的EAGAIN.
这是否会咬我,还是有更好的做法?