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 <[email protected]>:

> 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);
>
>
> ------------------------------
> [email protected]
>
> *From:* Tim Chou <[email protected]>
> *Date:* 2016-03-23 18:31
> *To:* libevent-users <[email protected]>
> *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;
>   }
>
> }
>

Reply via email to