[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] Retry buffered event writes on partial write or error?



I'm trying to understand retry strategies on buffered events. I'm
using the hello-world.c as an example.

Suppose I have a listener created with evconnlistener_new_bind. A
connection is made and the listener_cb is invoked.

The listener_cb sets two callbacks for the write - conn_writecb and
conn_eventcb:

    bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL);
    bufferevent_write(bev, MESSAGE, strlen(MESSAGE));

The conn_writecb is shown below.

conn_writecb(struct bufferevent *bev, void *user_data)
{
    struct evbuffer *output = bufferevent_get_output(bev);
    if (evbuffer_get_length(output) == 0) {
        bufferevent_free(bev);
    }
}

I see the buffered event is cleaned up on a successful write.

conn_eventcb(struct bufferevent *bev, short events, void *user_data)
{
    if (events & BEV_EVENT_EOF) {
        printf("Connection closed.\n");
    } else if (events & BEV_EVENT_ERROR) {
        printf("Got an error on the connection: %s\n",
            strerror(errno));/*XXX win32*/
    }
    bufferevent_free(bev);
}

In the case of an error, I only see the close.

How do I retry it if there's a partial write? Is this a case, should I
call event_add an attempt to finish the write? Would that occur in
conn_writecb or conn_eventcb?

Thanks in advance.
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.