[Sheepdog] [PATCH] fix a bug in rx() when read() returns 0 but connection is not marked as closed.
levin li
levin108 at gmail.com
Tue Apr 24 11:19:10 CEST 2012
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
More information about the sheepdog
mailing list