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

Re: [Libevent-users] Add multiples bufferevents on one base then lead to some errors.



The listener indeed helps me to reduce the coding efforts. However, what I want to do is still not working.

Is it possible to bind several connections to a base and dispatch event of the base in a new thread?
So I use main function to accept the connection and add this fd to a base running in another thread?

Thanks,
Fang

2016-03-23 19:08 GMT-04:00 Tim Chou <timchou.hit@xxxxxxxxx>:
Hi Michael,

Thank you so much.

After reading the example, I realize the listener is the right way to bind new connections to the base.

I will try this way.

Thanks, again.
Fang


2016-03-23 18:48 GMT-04:00 Michael (Tieying) Zhang <tieyingz@xxxxxxxxxx>:
Hi Fang,
Â
I think you can use the example code from the documentation, and you don't need to set it nonblocking manually in this way.
Â
        struct event_base *base;
        struct evconnlistener *listener;
        struct sockaddr_in sin;

        int port = 9876;

        if (argc > 1) {
                port = atoi(argv[1]);
        }
        if (port<=0 || port>65535) {
                puts("Invalid port");
                return 1;
        }

        base = event_base_new();
        if (!base) {
                puts("Couldn't open event base");
                return 1;
        }

        /* Clear the sockaddr before using it, in case there are extra
         * platform-specific fields that can mess us up. */
        memset(&sin, 0, sizeof(sin));
        /* This is an INET address */
        sin.sin_family = AF_INET;
        /* Listen on 0.0.0.0 */
        sin.sin_addr.s_addr = htonl(0);
        /* Listen on the given port. */
        sin.sin_port = htons(port);

        listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
            LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,
            (struct sockaddr*)&sin, sizeof(sin));
        if (!listener) {
                perror("Couldn't create listener");
                return 1;
        }
        evconnlistener_set_error_cb(listener, accept_error_cb);

        event_base_dispatch(base);
Â

Â
From:ÂTim Chou
Date:Â2016-03-23Â18:31
Subject:Â[Libevent-users] Add multiples bufferevents on one base then lead to some errors.
Hi all,

Sorry to disturb you.Â
I'm writing a server. I plan to use one thread serving ten connections.
I use bufferevent_setcb to register 10 sockets to one base. I also use a global variable to count the number.

I think I can register the bufferevent on one base before I start a pthread to dispatch().
However, I always get the error: [err] event_queue_insert: 0x146dfc8(fd 32) already on queue 2

If I create one thread for one base with only one bufferevent, then the program works well.

Does anyone help me?
Looking forward to your replies.

Thanks,
Fang

Below is my code.Â

on_accept(){
...
 evutil_make_socket_nonblocking(client_fd);

 if (num_dist==0) {
  evbase=event_base_new();
 }
 /* Create a buffer event. */
 bev = malloc(sizeof(struct bufferevent));
 bev = bufferevent_socket_new(evbase, client_fd, BEV_OPT_CLOSE_ON_FREE);

 bufferevent_setcb(bev, buffered_on_read, buffered_on_write, NULL, NULL);

 bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);

 num_dist++;
 if (num_dist==10) {
 tid=malloc(sizeof(pthread_t));
 pthread_mutex_lock(&mutex);
 total_thread++;
 printf("%d thread creates.\n",total_thread);
 pthread_mutex_unlock(&mutex);
 pthread_create(&tid, NULL, &server_job_function, (void *) evbase);
 num_dist=0;
 }

}