Frage

Ich habe den folgenden Libev-Code:

#include <ev.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <netinet/in.h>

ev_io stdin_watcher;

static void cb(EV_P_ ev_io *w, int revents){
        puts ("hello");

        //read file here - suggestion due to Ioan
        #define BUF_LEN 10
        char buf[BUF_LEN];
        memset(buf,0,BUF_LEN);
        int byte_read;
        while( (byte_read = recv(w->fd,buf,BUF_LEN-1,0)) > 0) {
                printf("len: %i: %s",byte_read,buf);
                memset(buf,0,BUF_LEN);
        }


        if(-1 == byte_read && EAGAIN != errno) {
            perror("recv");
        }
        close(w->fd);

        //ev_io_stop (EV_A_ w);
        //ev_unloop (EV_A_ EVUNLOOP_ALL);
}


int main (void){
        struct ev_loop *loop = ev_default_loop (0);
        int len;

        int sd;
        sd=socket(AF_UNIX,SOCK_STREAM,0);

        struct sockaddr_un address;
        //memset(&address,0,sizeof(address));
        address.sun_family=AF_UNIX;
        strcpy(address.sun_path,"/tmp/mysocket");
        unlink(address.sun_path);
        len=strlen(address.sun_path)+sizeof(address.sun_family);

        int x=bind(sd,(struct sockaddr*)&address,sizeof(address));
        printf("%d\n",x);
        listen(sd,5);

        ev_io_init(&stdin_watcher,cb,sd,EV_READ);
        ev_io_start(loop,&stdin_watcher);

        ev_loop (loop, 0);

        // unloop was called, so exit
        return 0;
}

Alles funktioniert (fast) einwandfrei.Kompilieren: gcc file.c -lev, und lauf ./a.out.Dann schreibe in den Socket das ./a.out hört zu: echo "gobblydeegook" | nc -U /tmp/mysocket.

Hallo erscheint wie erwartet auf der Konsole.

Aber das Programm ruft das Ereignis auf und druckt dann unendlich oft "Hallo"!Ich möchte, dass es diesen Unix-Socket weiterhin auf Schreibvorgänge überwacht.Wie mache ich das?

War es hilfreich?

Lösung

Das Ereignis wird aufgerufen, wenn Daten auf dem Socket gelesen werden sollen.Da Sie die Daten nicht aus dem Socket entfernen, sondern nur "Hallo" drucken, wird das Ereignis erneut aufgerufen, damit Sie die Daten verarbeiten können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top