title: How to close socket after writing in libevent with bufferevents?
body: <p>Here is an example of echo TCP server from libevent book. 
  How can I modify it to close a socket after each write. I know that I can close a socket connection by calling bufferevent_free(), but I don't understand how use it to close connection every time I send an echo to the socket.  </p>
  
  <pre><code>#include &lt;event2/listener.h&gt;
  #include &lt;event2/bufferevent.h&gt;
  #include &lt;event2/buffer.h&gt;
  
  #include &lt;arpa/inet.h&gt;
  
  #include &lt;string.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;errno.h&gt;
  
  static void
  echo_read_cb(struct bufferevent *bev, void *ctx)
  {
          /* This callback is invoked when there is data to read on bev. */
          struct evbuffer *input = bufferevent_get_input(bev);
          struct evbuffer *output = bufferevent_get_output(bev);
  
          /* Copy all the data from the input buffer to the output buffer. */
          evbuffer_add_buffer(output, input);
  }
  
  static void
  echo_event_cb(struct bufferevent *bev, short events, void *ctx)
  {
          if (events &amp; BEV_EVENT_ERROR)
                  perror("Error from bufferevent");
          if (events &amp; (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
                  bufferevent_free(bev);
          }
  }
  
  static void
  accept_conn_cb(struct evconnlistener *listener,
      evutil_socket_t fd, struct sockaddr *address, int socklen,
      void *ctx)
  {
          /* We got a new connection! Set up a bufferevent for it. */
          struct event_base *base = evconnlistener_get_base(listener);
          struct bufferevent *bev = bufferevent_socket_new(
                  base, fd, BEV_OPT_CLOSE_ON_FREE);
  
          bufferevent_setcb(bev, echo_read_cb, NULL, echo_event_cb, NULL);
  
          bufferevent_enable(bev, EV_READ|EV_WRITE);
  }
  
  static void
  accept_error_cb(struct evconnlistener *listener, void *ctx)
  {
          struct event_base *base = evconnlistener_get_base(listener);
          int err = EVUTIL_SOCKET_ERROR();
          fprintf(stderr, "Got an error %d (%s) on the listener. "
                  "Shutting down.\n", err, evutil_socket_error_to_string(err));
  
          event_base_loopexit(base, NULL);
  }
  
  int
  main(int argc, char **argv)
  {
          struct event_base *base;
          struct evconnlistener *listener;
          struct sockaddr_in sin;
  
          int port = 9876;
  
          if (argc &gt; 1) {
                  port = atoi(argv[1]);
          }
          if (port&lt;=0 || port&gt;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(&amp;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*)&amp;sin, sizeof(sin));
          if (!listener) {
                  perror("Couldn't create listener");
                  return 1;
          }
          evconnlistener_set_error_cb(listener, accept_error_cb);
  
          event_base_dispatch(base);
          return 0;
  }
  </code></pre>