Giter Site home page Giter Site logo

libae's Introduction

libae

Redis's async event library, you can use it in your projects.

supported event multiplexing model

  • epoll
  • kqueue
  • ev_port
  • select

Example

Timer

Print Hello, World on screen every 10 seconds:

int print(struct aeEventLoop *loop, long long id, void *clientData)
{
    printf("%lld - Hello, World\n", id);
    return -1;
}

int main(void)
{
    aeEventLoop *loop = aeCreateEventLoop(0);
    int i;
    for (i = 0; i < 10; i ++) {
        aeCreateTimeEvent(loop, i*1000, print, NULL, NULL);
    }
    aeMain(loop);
    aeDeleteEventLoop(loop);
    return 0;
}

Echo server

Start an echo server on 8000:

void writeToClient(aeEventLoop *loop, int fd, void *clientdata, int mask)
{
    char *buffer = clientdata;
    printf("%p\n", clientdata);
    write(fd, buffer, strlen(buffer));
    free(buffer);
    aeDeleteFileEvent(loop, fd, AE_WRITABLE);
}

void readFromClient(aeEventLoop *loop, int fd, void *clientdata, int mask)
{
    int buffer_size = 1024;
    char *buffer = malloc(sizeof(char) * buffer_size);
    bzero(buffer, buffer_size);
    int size;
    size = read(fd, buffer, buffer_size);
    aeCreateFileEvent(loop, fd, AE_WRITABLE, writeToClient, buffer);
}

void acceptTcpHandler(aeEventLoop *loop, int fd, void *clientdata, int mask)
{
    int client_port, client_fd;
    char client_ip[128];
    // create client socket
    client_fd = anetTcpAccept(NULL, fd, client_ip, 128, &client_port);
    printf("Accepted %s:%d\n", client_ip, client_port);

    // set client socket non-block
    anetNonBlock(NULL, client_fd);

    // regist on message callback
    int ret;
    ret = aeCreateFileEvent(loop, client_fd, AE_READABLE, readFromClient, NULL);
    assert(ret != AE_ERR);
}

int main()
{
    int ipfd;
    // create server socket
    ipfd = anetTcpServer(NULL, 8000, "0.0.0.0", 0);
    assert(ipfd != ANET_ERR);

    // create main event loop
    aeEventLoop *loop;
    loop = aeCreateEventLoop(1024);

    // regist socket connect callback
    int ret;
    ret = aeCreateFileEvent(loop, ipfd, AE_READABLE, acceptTcpHandler, NULL);
    assert(ret != AE_ERR);

    // start main loop
    aeMain(loop);

    // stop loop
    aeDeleteEventLoop(loop);

    return 0;
}

original document

libae's People

Contributors

0x7fff5238100b avatar aisk avatar sinuxlee avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

libae's Issues

RHEL7编译出错

samuel@localhost:~/src/libae$ make
cc -c -std=c99 -g -O0 -Wno-parentheses -Wno-switch-enum -Wno-unused-value src/anet.c -o src/anet.o
src/anet.c: In function ‘anetGenericResolve’:
src/anet.c:178:21: error: storage size of ‘hints’ isn’t known
struct addrinfo hints, *info;
^
src/anet.c:182:48: error: ‘AI_NUMERICHOST’ undeclared (first use in this function)
if (flags & ANET_IP_ONLY) hints.ai_flags = AI_NUMERICHOST;

Add to a C++ app

I'm trying to add libae in a C++ project, using CMAKE
But, the ae_epoll.c (as well as evport, kqueue, select) header files are causing some issues in the make:

My CMAKE:
cmake_minimum_required(VERSION 3.17)
project(dynbe)

set(CMAKE_CXX_STANDARD 14)

set(libae "src/libae/ae.h" "src/libae/ae.c" "src/libae/anet.h" "src/libae/anet.c"
"src/libae/ae_evport.c" "src/libae/ae_epoll.c" "src/libae/ae_kqueue.c"
"src/libae/ae_select.c" "src/libae/config.h" "src/libae/fmacros.h"
"src/libae/zmalloc.h")

add_library(ae STATIC ${libae})

add_executable(dynbe main.cpp src/libs/SingleBehavior.h src/libs/EchoServer.h
src/Behavior.h src/FdEventProc.h)

target_link_libraries(dynbe ae)

Error I get when CMAKE

/home/ubung/C_C++/C++/dynbe/src/libae/ae_evport.c:33:10: fatal error: port.h: No such file or directory
#include <port.h>
^~~~~~~~
compilation terminated.
CMakeFiles/ae.dir/build.make:108: recipe for target 'CMakeFiles/ae.dir/src/libae/ae_evport.c.o' failed

make[2]: *** [CMakeFiles/ae.dir/src/libae/ae_evport.c.o] Error 1
make[2]: *** Waiting for unfinished jobs....

/home/ubung/C_C++/C++/dynbe/src/libae/ae_kqueue.c:33:10: fatal error: sys/event.h: No such file or directory
#include <sys/event.h>
^~~~~~~~~~~~~
compilation terminated.
CMakeFiles/ae.dir/build.make:134: recipe for target 'CMakeFiles/ae.dir/src/libae/ae_kqueue.c.o' failed

make[2]: *** [CMakeFiles/ae.dir/src/libae/ae_kqueue.c.o] Error 1
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:42:24: error: unknown type name ‘aeEventLoop’
static int aeApiCreate(aeEventLoop *eventLoop) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:52:24: error: unknown type name ‘aeEventLoop’
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:58:23: error: unknown type name ‘aeEventLoop’
static void aeApiFree(aeEventLoop *eventLoop) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:62:26: error: unknown type name ‘aeEventLoop’
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:70:27: error: unknown type name ‘aeEventLoop’
static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:38:24: error: unknown type name ‘aeEventLoop’
static int aeApiCreate(aeEventLoop *eventLoop) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_select.c:77:22: error: unknown type name ‘aeEventLoop’
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:57:24: error: unknown type name ‘aeEventLoop’
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:64:23: error: unknown type name ‘aeEventLoop’
static void aeApiFree(aeEventLoop *eventLoop) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:72:26: error: unknown type name ‘aeEventLoop’
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
^~~~~~~~~~~
CMakeFiles/ae.dir/build.make:147: recipe for target 'CMakeFiles/ae.dir/src/libae/ae_select.c.o' failed
make[2]: *** [CMakeFiles/ae.dir/src/libae/ae_select.c.o] Error 1
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:89:27: error: unknown type name ‘aeEventLoop’
static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask) {
^~~~~~~~~~~
/home/ubung/C_C++/C++/dynbe/src/libae/ae_epoll.c:107:22: error: unknown type name ‘aeEventLoop’
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
^~~~~~~~~~~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.