Pregunta

Tengo el siguiente libev código:

#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;
}

Todo funciona bien (casi).Compilar: gcc file.c -lev, y ejecutar ./a.out.A continuación, escribir en el socket que ./a.out escucha: echo "gobblydeegook" | nc -U /tmp/mysocket.

Hola aparece en la consola como se esperaba.

Pero el programa llama al evento y, a continuación, mantiene imprimir "hola" ad-infinitum!Yo quiero continuar en el seguimiento de este socket de unix para las escrituras.Cómo hacer esto?

¿Fue útil?

Solución

El evento se llama cuando hay datos que se leen en el zócalo.Puesto que usted no es la eliminación de los datos de la toma, se acaba de imprimir "hola", el evento se llama de nuevo para usted para manejar los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top