Splice und UDP-Sockets



  • Hallo,

    ich möchte die Daten aus einer UDP-Verbindung möglichst performant auf die Festplatte schreiben. Dazu habe ich folgendes mit splice versucht:

    int mysocket; //richtig initialisiert, recv() funktioniert problemlos
    FILE *myfile; 
    int mypipe[2]; 
    
    if(pipe(mypipe)<0){return;}
    splice(mysocket, NULL, mypipe[1], NULL, buffersize, SPLICE_F_MOVE);
    splice(mypipe[0], NULL, fileno(myfile), NULL, buffersize, SPLICE_F_MOVE);
    

    Bereits der erste Aufruf von splice endet mit EINVAL. Kann mir jemand sagen, was ich falsch mache, bzw. ob splice auf sockets überhaupt funktioniert?

    (Benutze Ubuntu 9.10 und Kernel 2.6.31)

    Vielen Dank schonmal 🙂

    Chris



  • Wie hast du denn myfile geöffnet?



  • Hallo Rüdiger,

    myfile öffne ich mit fopen("test.txt","w"), allerdings schlägt wie gesagt bereits der erste splice-Aufruf fehl.

    Aus der man-Page:

    EINVAL:
    Target file system doesn't support splicing; neither of the descriptors refers to a pipe; or offset given for non-seekable device

    Offsets benutze ich keine, einer der Deskriptoren ist eine Pipe, also bliebe nur, dass man sockets nicht benutzen darf.

    Andererseits habe ich in Mailing-Listen von 2008 gefunden, dass dies seit Kernel 2.6.25 eigentlich funktionieren sollte.

    Weiß vielleicht jemand wie es heute damit aussieht?



  • Gast_Chris schrieb:

    Offsets benutze ich keine, einer der Deskriptoren ist eine Pipe, also bliebe nur, dass man sockets nicht benutzen darf.

    man page schrieb:

    EBADF One or both file descriptors are not valid, or do not have proper read-write mode.
    EINVAL Target file system doesn't support splicing; target file is opened in append mode; neither of the descriptors refers to a pipe; or offset given for nonseekable device.
    ENOMEM Out of memory.
    ESPIPE Either off_in or off_out was not NULL, but the corresponding file descriptor refers to a pipe.

    Müsste da nicht eher ein EBADF kommen?

    Dateisysteme unterstützen es seit .31 alle.
    Die Datei wurde mit "w" geöffnet also nicht append.
    Immer eine Pipe und nie Offsets.
    Also gäbe es erstmal keinen Grund für EINVAL.

    buffersize hat auch einen sinnvollen Wert?

    Funktioniert es denn mit einem equivalenten tcp-socket?

    Sonst geb mal ein Minimalbeispiel.


Anmelden zum Antworten