Können Sie einige Anleitungen zu Epoll unter Linux empfehlen? [closed]

Lesezeit: 4 Minuten

Konnen Sie einige Anleitungen zu Epoll unter Linux empfehlen closed
Simon Kim

Ich muss etwas über Epoll On Linux System wissen.

Können Sie Handbücher oder Leitfäden zur Epoll-Bibliothek empfehlen?

bräuchte genauere Anleitungen. Es ist besser, einige Beispiele zu haben.

Hilf mir. und danke fürs lesen.

  • Ich habe epoll() ausgiebig verwendet und es ist großartig. Ich habe es mit 128K aktiven Sockets getestet und es funktioniert sehr gut. Wenn Sie spezielle Fragen haben, fragen Sie bitte.

    –Martin Del Vecchio

    10. September 2008 um 14:59 Uhr

  • Danke. Du hast tolle Arbeit geleistet!! 128k Steckdosen!! fantastisch! Können Sie mir einen Kommentar oder ein Beispiel mitteilen, wie 128.000 aktive Sockets akzeptiert werden? PS: Die Antwort ist zu lang. Es tut mir leid.

    – Simon Kim

    5. Oktober 2008 um 10:00 Uhr

  • @Simon: Es ist einfach, so viele zu bekommen, wenn Sie Verbindungen von Clients mit unterschiedlichen IPs akzeptieren. Jede IP ist theoretisch auf 64.000 Ports und in der Praxis wahrscheinlich auf 20-30.000 begrenzt. Wahrscheinlich möchten Sie mehrere Testsysteme.

    – Zan Luchs

    4. April 2011 um 16:52 Uhr

  • Ich denke, diese Frage sollte nicht geschlossen werden, sie fragt nach dem Wissen über die Verwendung epoll.

    – Nur wir

    1. März 2019 um 5:50 Uhr

1645965008 278 Konnen Sie einige Anleitungen zu Epoll unter Linux empfehlen closed
Ryan Gast

Hier ist eine Einführung in Epoll, ein ziemlich einfaches Tutorial: http://blog.kovyrin.net/2006/04/13/epoll-asynchronous-network-programming/

Ein vollständigeres Beispiel finden Sie hier: https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/

Ebenfalls, die Manpages

  • Zweiter und dritter Link sind defekt.

    – Georgi Georgiew

    15. April 2018 um 21:42 Uhr

  • Der dritte Link führt zu einer Phishing-Seite

    – Magmike

    3. Juli 2019 um 9:49 Uhr

Konnen Sie einige Anleitungen zu Epoll unter Linux empfehlen closed
Viswestn

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>

#define PORT 1500 

#define MAX_CON (1200)

static struct epoll_event *events;

int main(int argc, char *argv[])
{
    fd_set master;
    fd_set read_fds;
    struct sockaddr_in serveraddr;
    struct sockaddr_in clientaddr;
    int fdmax;
    int listener;
    int newfd;
    char buf[1024];
    int nbytes;
    int addrlen;
    int yes;
    int epfd = -1;
    int res = -1;
    struct epoll_event ev;
    int i=0;
    int index = 0;
    int client_fd = -1;

    int SnumOfConnection = 0;
    time_t Sstart, Send;

    if((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
            perror("Server-socket() error lol!");
            exit(1);
    }

    if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
    {
            perror("Server-setsockopt() error lol!");
            exit(1);
    }
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    serveraddr.sin_port = htons(PORT);
    memset(&(serveraddr.sin_zero), '\0', 8);
    if(bind(listener, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == -1)
    {
            perror("Server-bind() error lol!");
            exit(1);
    }
    if(listen(listener, 10) == -1)
    {
            perror("Server-listen() error lol!");
            exit(1);
    }
    fdmax = listener; /* so far, it's this one*/

    events = calloc(MAX_CON, sizeof(struct epoll_event));
    if ((epfd = epoll_create(MAX_CON)) == -1) {
            perror("epoll_create");
            exit(1);
    }
    ev.events = EPOLLIN;
    ev.data.fd = fdmax;
    if (epoll_ctl(epfd, EPOLL_CTL_ADD, fdmax, &ev) < 0) {
            perror("epoll_ctl");
            exit(1);
    }
    //time(&start);
    for(;;)
    {
            res = epoll_wait(epfd, events, MAX_CON, -1);
            client_fd = events[index].data.fd;

            for (index = 0; index < MAX_CON; index++) {
                    if(client_fd == listener)
                    {
                            addrlen = sizeof(clientaddr);
                            if((newfd = accept(listener, (struct sockaddr *)&clientaddr, &addrlen)) == -1)
                            {
                                    perror("Server-accept() error lol!");
                            }
                            else
                            {
                            //      printf("Server-accept() is OK...\n");
                                    ev.events = EPOLLIN;
                                    ev.data.fd = newfd;
                                    if (epoll_ctl(epfd, EPOLL_CTL_ADD, newfd, &ev) < 0) {
                                            perror("epoll_ctl");
                                            exit(1);
                                    }
                            }
                            break;
                    }
                    else
                    {
                            if (events[index].events & EPOLLHUP)
                            {
                                    if (epoll_ctl(epfd, EPOLL_CTL_DEL, client_fd, &ev) < 0) {
                                            perror("epoll_ctl");
                                    }
                                    close(client_fd);
                                    break;
                            }
                            if (events[index].events & EPOLLIN)  {
                                    if((nbytes = recv(client_fd, buf, sizeof(buf), 0)) <= 0)
                                    {
                                            if(nbytes == 0) {
                                            //      printf("socket %d hung up\n", client_fd);
                                            }
                                            else {
                                                    printf("recv() error lol! %d", client_fd);
                                                    perror("");
                                            }

                                            if (epoll_ctl(epfd, EPOLL_CTL_DEL, client_fd, &ev) < 0) {
                                                    perror("epoll_ctl");
                                            }
                                            close(client_fd);
                                    }
                                    else
                                    {
                                            if(send(client_fd, buf, nbytes, 0) == -1)
                                                    perror("send() error lol!");
                                    }
                                    break;
                            }
                    }
            }
    }
    return 0;
}

Ich habe dieses Programm zum Testen geschrieben und konnte mehr als 80.000 Verbindungen herstellen, und ich finde eine durchschnittliche Systemlast von nur 0,27%.

  • Sie können calloc nicht so in cpp verwenden. Sie sollten es mit (epoll_event*) wie folgt umwandeln: events =(epoll_event*) calloc(MAX_CON, sizeof(struct epoll_event));

    – noch

    13. April 2014 um 14:38 Uhr


  • Ughh .. der Code muss mit vielen unbenutzten Variablen aufgeräumt werden, die nur bei der Verwendung benötigt werden select

    – Sören

    27. November 2014 um 14:25 Uhr

875960cookie-checkKönnen Sie einige Anleitungen zu Epoll unter Linux empfehlen? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy