Datei per Socket übertragen



  • Hallo,

    ich möchte gerne per UDP Socket eine Datei von einem Server an einen Client übertragen. Die Verbindung zwischen den beiden steht auch soweit.
    Jetzt habe ich das Problem, das wenn ich die Datei per

    while( fgets( linebuf, BIGBUF, fIOFile ) != (char*)NULL )
    {
         rc = sendto ( sd, linebuf, strlen(linebuf), 0, (struct sockaddr*)&addr,     sizeof(struct sockaddr_in) );
    }
    

    einlase und verschicke und auf der Clientseite per

    while( 1 )
    {
        rc = recvfrom( sd, recv_buffer, sizeof(recv_buffer), 0, (struct sockaddr*)&remoteAddr, &remoteAddrLen );
    }
    

    empfange, der Datentransfer in unbestimmten Zeitabständen einfach abbricht.
    Die zu versendende Datei hat ungefähr 3Mb Größe und besteht aus 61000 Zeilen.
    Ich denke das hängt wohl mit der synchronisation zusammen. Wie kann man eine Datei vielleicht besser übertragen?



  • Du weisst dass die Daten auf IP-Ebene in Pakete zerteilt werden und in Häppchen verschickt wird?
    Du weisst auch dass UDP Dir in keinster Weise garantiert dass die Pakete überhaupt ankommen?

    Besser kann man eine Datei mit TCP übertragen...



  • Hmm, ok das heißt ich ändere den Sockettyp auf TCP und baue noch ein accept mit ein. Aber die beiden while schleifen können bleiben wie sie sind?
    Habe ich dann eine Garantie das die Daten ankommen?



  • fgets ➡ fread
    sendto ➡ send
    recvfrom ➡ recv



  • ich möchte gerne per UDP Socket eine Datei von einem Server an einen Client übertragen. Die Verbindung zwischen

    ist udp nicht ein verbindungsloses protokoll?



  • Moh schrieb:

    ist udp nicht ein verbindungsloses protokoll?

    Ist das nicht ein wenig spitzfindig? 😉

    Dass mit connect/accept keine Verbindung aufgebaut wurde sieht man an der Verwendung von sendto/recvfrom, und ergibt sich auch aus dem Text. Dass irgendeine physikalische Verbindung zwischen den beiden auch bei einem "verbindungslosen Protokoll" bestehen muss ergibt sich.



  • Soso, heute sind wir hier wieder mal zu späßen aufgelegt 😉

    NBein jetzt mal im Ernst, wieso sollte es besser funktionieren, wenn ich anstatt UDP TCP verwende? Ich meine das hat doch keinen Einfluss darauf, das die while Schleife vielleicht zu schnell abgearbeitet wird, oder doch?

    Und dann noch eine Frage. Könnte ich auch die komplette Datei in den Speicher mappen, und dann nur einmal send oder sendto aufrufen? Wie muss dann der Client empfangen? Auch nur mit einmal recv oder recvfrom? Odermuss ich solange empfangen, bis die Anzahl der empfangenen Bytes = = 0 ist?



  • DU WILLST TCP.

    und jetzt fuege dich. widerstand ist zwecklos.

    lesen, ist wichtig: http://beej.us/guide/bgnet/



  • @c.rackwitz
    Danke für den Link, war echt informativ und ich werde mal die eine oder andere Technik ausprobieren, ob sie hilft.

    Aber ich bin ein Jedi, also hör auf mit deiner Hand vor meinem Gesicht herumzuwedeln.....


Anmelden zum Antworten