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 |