Convert Figma logo to code with AI

libevent logolibevent

Event notification library

11,060
3,375
11,060
144

Top Related Projects

33,257

Netty project - an event-driven asynchronous network application framework

106,466

Node.js JavaScript runtime ✨🐢🚀✨

23,916

Cross-platform asynchronous I/O

9,619

ZeroMQ core engine in C++, implements ZMTP/3.1

Quick Overview

Libevent is a powerful, cross-platform event notification library for developing high-performance network servers. It provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached, making it ideal for building scalable network applications.

Pros

  • High performance and scalability, capable of handling thousands of concurrent connections
  • Cross-platform support, including Windows, Linux, macOS, and various Unix-like systems
  • Extensive API with support for various event types (I/O, timer, signal)
  • Active development and maintenance with a large community

Cons

  • Steep learning curve for beginners due to its low-level nature
  • Documentation can be sparse or outdated in some areas
  • Potential for callback hell in complex applications
  • Some users report occasional stability issues in edge cases

Code Examples

  1. Basic event loop setup:
#include <event2/event.h>

int main() {
    struct event_base *base = event_base_new();
    event_base_dispatch(base);
    event_base_free(base);
    return 0;
}
  1. Adding a timer event:
#include <event2/event.h>

void timer_cb(evutil_socket_t fd, short what, void *arg) {
    printf("Timer fired!\n");
}

int main() {
    struct event_base *base = event_base_new();
    struct event *timer_event = event_new(base, -1, EV_PERSIST, timer_cb, NULL);
    struct timeval tv = {1, 0}; // 1 second
    event_add(timer_event, &tv);
    event_base_dispatch(base);
    event_free(timer_event);
    event_base_free(base);
    return 0;
}
  1. Setting up a TCP server:
#include <event2/listener.h>

void accept_cb(struct evconnlistener *listener, evutil_socket_t fd,
               struct sockaddr *address, int socklen, void *ctx) {
    printf("New connection accepted\n");
}

int main() {
    struct event_base *base = event_base_new();
    struct sockaddr_in sin = {0};
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(8080);
    
    struct evconnlistener *listener = evconnlistener_new_bind(base, accept_cb, NULL,
        LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1, (struct sockaddr*)&sin, sizeof(sin));
    
    event_base_dispatch(base);
    evconnlistener_free(listener);
    event_base_free(base);
    return 0;
}

Getting Started

  1. Install libevent:

    • On Ubuntu/Debian: sudo apt-get install libevent-dev
    • On macOS with Homebrew: brew install libevent
  2. Include the necessary headers in your C file:

    #include <event2/event.h>
    
  3. Compile your program with libevent:

    gcc -o myprogram myprogram.c -levent
    
  4. Run your program:

    ./myprogram
    

Competitor Comparisons

33,257

Netty project - an event-driven asynchronous network application framework

Pros of Netty

  • Higher-level abstraction, easier to use for complex networking applications
  • Better performance for high-concurrency scenarios
  • More comprehensive feature set, including HTTP, WebSocket, and SSL/TLS support

Cons of Netty

  • Steeper learning curve due to more complex API
  • Larger codebase and memory footprint
  • Java-specific, limiting cross-language compatibility

Code Comparison

Libevent (C):

struct event_base *base = event_base_new();
struct evhttp *http = evhttp_new(base);
evhttp_set_cb(http, "/", handle_request, NULL);
evhttp_bind_socket(http, "0.0.0.0", 8080);
event_base_dispatch(base);

Netty (Java):

EventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(group)
 .channel(NioServerSocketChannel.class)
 .childHandler(new HttpServerInitializer());
b.bind(8080).sync().channel().closeFuture().sync();

Both libraries provide event-driven networking capabilities, but Netty offers a more feature-rich and higher-level API at the cost of increased complexity. Libevent is lighter and more portable, making it suitable for simpler use cases and C-based projects. Netty excels in Java environments, especially for complex, high-performance networking applications.

106,466

Node.js JavaScript runtime ✨🐢🚀✨

Pros of Node.js

  • Higher-level runtime environment, easier for developers to build applications
  • Extensive package ecosystem (npm) with a wide range of modules
  • Built-in support for asynchronous I/O and event-driven programming

Cons of Node.js

  • Larger codebase and more complex architecture
  • Potentially higher memory usage and slower performance for certain low-level operations
  • Less suitable for systems programming or embedded applications

Code Comparison

Node.js (JavaScript):

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, World!');
});

server.listen(8080);

libevent (C):

#include <event2/event.h>
#include <event2/http.h>

static void handle_request(struct evhttp_request *req, void *arg) {
    evhttp_send_reply(req, 200, "OK", NULL);
}

int main() {
    struct event_base *base = event_base_new();
    struct evhttp *http = evhttp_new(base);
    evhttp_set_gencb(http, handle_request, NULL);
    evhttp_bind_socket(http, "0.0.0.0", 8080);
    event_base_dispatch(base);
    return 0;
}
23,916

Cross-platform asynchronous I/O

Pros of libuv

  • Cross-platform support with consistent API across Windows and Unix-like systems
  • Integrated with Node.js, providing a familiar ecosystem for JavaScript developers
  • Offers a more comprehensive feature set, including file system operations and DNS utilities

Cons of libuv

  • Steeper learning curve due to its more complex API
  • Larger codebase, which may lead to increased compile times and binary sizes
  • Less flexible for certain low-level customizations compared to libevent

Code Comparison

libuv example:

uv_loop_t *loop = uv_default_loop();
uv_tcp_t server;
uv_tcp_init(loop, &server);
uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);
uv_listen((uv_stream_t*)&server, SOMAXCONN, on_new_connection);

libevent example:

struct event_base *base = event_base_new();
struct evconnlistener *listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
    LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, -1,
    (struct sockaddr*)&sin, sizeof(sin));

Both libraries provide event-driven programming models, but libuv offers a more modern and comprehensive approach, while libevent focuses on simplicity and portability. The choice between them often depends on specific project requirements and developer preferences.

9,619

ZeroMQ core engine in C++, implements ZMTP/3.1

Pros of libzmq

  • Higher-level messaging abstraction, simplifying complex communication patterns
  • Built-in support for various transport protocols (TCP, IPC, inproc)
  • Excellent scalability and performance for distributed systems

Cons of libzmq

  • Steeper learning curve due to more complex API
  • Heavier-weight solution, may be overkill for simple event-driven applications
  • Less flexibility for custom low-level event handling

Code Comparison

libzmq:

zmq_ctx_t *context = zmq_ctx_new();
void *socket = zmq_socket(context, ZMQ_REQ);
zmq_connect(socket, "tcp://localhost:5555");
zmq_send(socket, "Hello", 5, 0);
zmq_close(socket);
zmq_ctx_destroy(context);

libevent:

struct event_base *base = event_base_new();
struct event *ev = event_new(base, fd, EV_READ|EV_PERSIST, callback, NULL);
event_add(ev, NULL);
event_base_dispatch(base);
event_free(ev);
event_base_free(base);

Summary

libzmq is better suited for complex distributed systems with various messaging patterns, while libevent excels in simple event-driven applications. libzmq provides higher-level abstractions but may be more complex to learn, whereas libevent offers more flexibility for low-level event handling but requires more manual implementation for advanced messaging scenarios.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

libevent logo

CI Coverage Status Join the chat at https://gitter.im/libevent/libevent doxygen OpenSSF Scorecard

1. BUILDING AND INSTALLATION

CMake (Unix)

mkdir build && cd build
cmake ..     # Default to Unix Makefiles.
make
make verify  # (optional)

See Documentation/Building#Building on Unix using CMake for more information.

CMake (Windows)

Install CMake: https://cmake.org/

md build && cd build
cmake -G "Visual Studio 10" ..   # Or use any generator you want to use. Run cmake --help for a list
cmake --build . --config Release # Or "start libevent.sln" and build with menu in Visual Studio.

See Documentation/Building#Building on Windows for more information.

Package Managers

You can download and install libevent using the vcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install libevent

The libevent port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Autoconf

Note, since 2.2 it is deprecated

./configure
make
make verify   # (optional)
sudo make install

See Documentation/Building#Autoconf for more information.

2. USEFUL LINKS:

For the latest released version of Libevent, see the official website at https://libevent.org/ .

There's a pretty good work-in-progress manual up at http://www.wangafu.net/~nickm/libevent-book/ .

For the latest development versions of Libevent, access our Git repository via

$ git clone https://github.com/libevent/libevent.git

You can browse the git repository online at:

https://github.com/libevent/libevent

To report bugs, issues, or ask for new features:

Patches: https://github.com/libevent/libevent/pulls

OK, those are not really patches. You fork, modify, and hit the "Create Pull Request" button. You can still submit normal git patches via the mailing list.

Bugs, Features [RFC], and Issues: https://github.com/libevent/libevent/issues

Or you can do it via the mailing list.

There's also a libevent-users mailing list for talking about Libevent use and development:

https://archives.seul.org/libevent/users/

3. ACKNOWLEDGMENTS

The following people have helped with suggestions, ideas, code or fixing bugs.