【发布时间】:2011-01-27 08:50:41
【问题描述】:
我正在尝试测试已被对等方优雅关闭的已关闭套接字,而不会导致双重发送的延迟命中以引发SIGPIPE。
这里的一个假设是,如果套接字关闭,则在它最后一次写入/发送后立即被对等方优雅地关闭。过早关闭等实际错误在代码中的其他位置处理。
如果套接字仍然打开,将会有 0 个或更多字节的数据,我实际上还不想从套接字缓冲区中提取出来。
我在想我可以调用int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK); 来确定套接字是否仍然连接。如果它已连接但缓冲区中没有数据,我将返回 -1 和 errno == EAGAIN 并返回 sockfd 以供重用。如果它已被对等方优雅地关闭,我将获得ret == 0 并打开一个新连接。
我已经对此进行了测试,它似乎可以工作。但是,我怀疑在我接收数据的最后一位和对等点 FIN 到达之间有一个小窗口,我可以从我的测试 recv 中得到一个误报 EAGAIN。
这会咬我吗,还是有更好的方法?
【问题讨论】:
-
另一种方法是 select()(或 poll()),因为它可以同时控制一个 fd 读写,但我不知道它是否真的解决了你关于 FIN 计时的问题。
-
@Giuseppe:不,我认为 select 不会解决时间问题。
标签: c tcp network-programming