I think when reading on a blocking socket returns 0, it means the connection was closed by the other side, no other case would make read() returns 0 on a blocking socket On 2012年04月24日 16:40, Huxinwei wrote: > I proposed something similar a while ago. > The connection is actually staying in CLOSE_WAIT status while this happens. I'd suggest you consider something more reliable. > > + else if (!ret) { //FIXME: is this the best place to check? > + int r; > + struct tcp_info ti; > + socklen_t l = sizeof(struct tcp_info); > + r = getsockopt(conn->fd, SOL_TCP, TCP_INFO, (void*)&ti,&l); > + if (r< 0) panic("this is really wired"); > + if (ti.tcpi_state == TCP_CLOSE_WAIT) { > + conn->c_rx_state = C_IO_CLOSED; > + conn->c_tx_state = C_IO_CLOSED; > + } > + } > > FYI. > >> -----Original Message----- >> From: sheepdog-bounces at lists.wpkg.org >> [mailto:sheepdog-bounces at lists.wpkg.org] On Behalf Of Li Wenpeng >> Sent: Tuesday, April 24, 2012 4:00 PM >> To: sheepdog at lists.wpkg.org >> Subject: [Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but >> connection is not marked as closed. >> >> From: levin li<xingke.lwp at taobao.com> >> >> if read() returns 0,it means connection closed, but previous >> read() may set errno to EAGAIN, in which case rx() would just >> return 0 without set connection state as C_IO_CLOSED >> >> Signed-off-by: levin li<xingke.lwp at taobao.com> >> --- >> lib/net.c | 7 ++++++- >> 1 files changed, 6 insertions(+), 1 deletions(-) >> >> diff --git a/lib/net.c b/lib/net.c >> index 260ae38..8ac7c9e 100644 >> --- a/lib/net.c >> +++ b/lib/net.c >> @@ -70,7 +70,12 @@ int rx(struct connection *conn, enum conn_state >> next_state) >> int ret; >> >> ret = read(conn->fd, conn->rx_buf, conn->rx_length); >> - if (!ret || ret< 0) { >> + if (!ret) { >> + conn->c_rx_state = C_IO_CLOSED; >> + return 0; >> + } >> + >> + if (ret< 0) { >> if (errno != EAGAIN) >> conn->c_rx_state = C_IO_CLOSED; >> return 0; >> -- >> 1.7.1 >> >> -- >> sheepdog mailing list >> sheepdog at lists.wpkg.org >> http://lists.wpkg.org/mailman/listinfo/sheepdog |