Erste Schritte zum Erstellen von TCP-Verbindungen mit Libevent

einführen

Libevent ist eine Open-Source-Bibliothek für ereignisgesteuerte Programmierung, die plattformübergreifende Funktionen zur Ereignisverarbeitung und Netzwerkprogrammierung bietet. In diesem Blogbeitrag konzentrieren wir uns auf die Verwendung von Libevent zum Erstellen einer TCP-Verbindung. In diesem einfachen Leitfaden für den Einstieg erfahren Sie, wie Sie mit Libevent eine grundlegende Netzwerkkommunikation aufbauen und den Grundstein für komplexere Anwendungsszenarien legen.

Libevent-Übersicht
Libevent ist eine ereignisgesteuerte Bibliothek, die in der Sprache C geschrieben ist und für asynchrone E/A, Timer, Signalverarbeitung usw. verwendet wird. Es bietet eine gute Leistung bei der Verarbeitung einer großen Anzahl gleichzeitiger Verbindungen und eignet sich zum Aufbau leistungsstarker Netzwerkanwendungen. Zu den Hauptkomponenten von Libevent gehören Ereignisschleife, Ereignishandler, Pufferverwaltung usw.

Installieren Sie Libevent

Bevor Sie beginnen, stellen Sie zunächst sicher, dass Libevent auf Ihrem System installiert ist. Sie können den Quellcode über den Paketmanager oder von der offiziellen Website (https://libevent.org/) herunterladen und kompilieren und installieren.

Verwenden Sie apt, um Libevent zu installieren (am Beispiel von Ubuntu)

sudo apt-get update
sudo apt-get install libevent-dev

Erstellen Sie eine TCP-Verbindung

Als Nächstes zeigen wir, wie Sie mit Libevent einen einfachen TCP-Server und -Client erstellen. Wir werden das von Libevent bereitgestellte Pufferereignis verwenden, um den Puffer zu verwalten und das Lesen und Schreiben von Daten zu vereinfachen.

TCP-Server


#include <event2/event.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>

void on_read(struct bufferevent* bev, void* ctx) {
    
    
    struct evbuffer* input = bufferevent_get_input(bev);
    struct evbuffer* output = bufferevent_get_output(bev);
    
    // 从输入缓冲区读取数据
    size_t len = evbuffer_get_length(input);
    char* data = malloc(len + 1);
    evbuffer_remove(input, data, len);
    data[len] = '\0';
    
    printf("Received data: %s\n", data);
    
    // 将数据写入输出缓冲区
    evbuffer_add(output, data, len);
    
    free(data);
}

void on_accept(struct evconnlistener* listener, evutil_socket_t fd,
               struct sockaddr* address, int socklen, void* ctx) {
    
    
    struct event_base* base = evconnlistener_get_base(listener);
    struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
    
    bufferevent_setcb(bev, on_read, NULL, NULL, NULL);
    bufferevent_enable(bev, EV_READ | EV_WRITE);
}

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

TCP-Client


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

void on_read(struct bufferevent* bev, void* ctx) {
    
    
    struct evbuffer* input = bufferevent_get_input(bev);
    struct evbuffer* output = bufferevent_get_output(bev);
    
    // 从输入缓冲区读取数据
    size_t len = evbuffer_get_length(input);
    char* data = malloc(len + 1);
    evbuffer_remove(input, data, len);
    data[len] = '\0';
    
    printf("Received data: %s\n", data);
    
    // 将数据写入输出缓冲区
    evbuffer_add(output, data, len);
    
    free(data);
}

void on_event(struct bufferevent* bev, short events, void* ctx) {
    
    
    if (events & BEV_EVENT_EOF) {
    
    
        printf("Connection closed.\n");
    } else if (events & BEV_EVENT_ERROR) {
    
    
        printf("Error on connection.\n");
    }
    
    bufferevent_free(bev);
}

int main() {
    
    
    struct event_base* base = event_base_new();
    struct bufferevent* bev = bufferevent_socket_new(
        base, -1, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE
    );
    
    bufferevent_setcb(bev, on_read, NULL, on_event, NULL);
    bufferevent_enable(bev, EV_READ | EV_WRITE);
    
    struct sockaddr_in sin;
    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(12345);
    
    bufferevent_socket_connect(bev, (struct sockaddr*)&sin, sizeof(sin));
    
    event_base_dispatch(base);
    
    bufferevent_free(bev);
    event_base_free(base);
    
    return 0;
}

Anwendungsszenarien

Die Verwendung von Libevent zum Erstellen von TCP-Verbindungen bietet vielfältige Anwendungsszenarien und eignet sich insbesondere für Netzwerkanwendungen mit hoher Parallelität. Zum Beispiel:

Netzwerkserver: Mit Libevent können leistungsstarke Netzwerkserver erstellt werden, die eine große Anzahl gleichzeitiger Verbindungen verarbeiten, z. B. Webserver, Chatserver usw.
Proxyserver: Über Libevent können Sie ganz einfach einen Proxyserver implementieren, um Anfragen weiterzuleiten und Antworten zu verarbeiten.
Echtzeit-Datenübertragung: Für die Echtzeit-Datenübertragung, wie Echtzeitspiele, Online-Videos usw., ist Libevent aufgrund seiner effizienten Leistung die ideale Wahl.
Verteiltes System: In einem verteilten System ist eine effiziente Kommunikation zwischen Knoten erforderlich. Libevent bietet einen ereignisgesteuerten Mechanismus, um diese Anforderung zu erfüllen.
Zusammenfassung
In diesem einfachen Leitfaden für die ersten Schritte haben Sie gelernt, wie Sie mit Libevent grundlegende TCP-Server und -Clients erstellen. Das ereignisgesteuerte Modell von Libevent macht die Handhabung einer großen Anzahl gleichzeitiger Verbindungen effizienter. Dies ist erst der Anfang, Sie können Ihre Webanwendung je nach tatsächlichem Bedarf weiter ausbauen und optimieren. Ich hoffe, dieser Artikel hilft Ihnen dabei, den ersten Schritt zur Erstellung leistungsstarker Webanwendungen mit Libevent zu machen.

おすすめ

転載: blog.csdn.net/qq_46017342/article/details/134449656