Daten mit recv empfangen



  • Hi Leute,
    ich will mit meinem Program über recv Daten empfangen. Jetzt hab ich aber ein Problem: Sobald der Server keine Dateien mehr sendet wird der Vorgang zum empfangen abgebrochen! Wie muss ich es also schreiben das meine Funktion empfangen() so lange wartet bis eine Nachricht vom Server geschickt wird? Bis jetzt sieht meine Funktion so aus:

    void empfangen(SOCKET s){
         ofstream out("Server Antwort.txt",ios_base::out|ios_base::ate);
         int rc;
         char antwort[256];
         for (;;){
             rc = recv(s, antwort, sizeof(antwort)-1, 0);
             if (rc<=0){
                       cout << "Empfangen fehlgeschlagen!!!";
                       break;
                       }
             else {
                  antwort[rc]='\0';
                  out << antwort;
                  }
             }
         out.close();
         closesocket(s);
    }
    

    Danke



  • Ich nehme an das es sich um eine Tcp Verbindung handelt.
    Wenn der Server die Verbindung abbaut (was er vermutlich tut, nachdem die Datei übertragen wurde) so gibt recv(..) 0 zurück und die for- Schleife wird verlassen (break).

    Bei den Verbindungsorientierten Protokollen gibt recv(..) 0 zurück wenn die Verbindung abgebaut wird. Das ist kein Fehler (cout << "Empfangen fehlgeschlagen!!!"; ist also nur die halbe Wahrheit.).

    Wie muss ich es also schreiben das meine Funktion empfangen() so lange wartet bis eine Nachricht vom Server geschickt wird?

    Wenn der Server die Verbindung abbaut, musst Du sie wieder aufbauen. Dies sollte (und tut es bei Dir auch) ausserhalb der empfangen(..) Funktion stattfinden.

    Simon



  • hm ja das würde vll gehn aber ist das nicht ziemlich schlecht weil das Programm dann eig nicht beendet werden kann, also es läuft ja dann auch weiter wenn die i-net verbindung getrennt wurde... Und außerdem braucht das ja recht viel rechenzeit weil das ja eine Endlosschleife ist!? Ich bin mir da nicht sicher bitte korrigiert mich! Und gibts da vll noch ne Möglichkeit?



  • Endlosschleifen brauchen nicht prinzipiell viel Rechenleistung.
    (Denke z.B. an eine Endlosschleife mit einem Sleep(1000) drin.)



  • Ich versteh auch nicht, was du dir davon versprichst, die Verbindung "offen" zu halten. Wenn der Server die Verbindung beendet, hat er dir vermutlich nichts weiter zu sagen. Auf welche Nachrichten wartest du denn?



  • Wenn die Verbindung getrennt wurde, müsste es nen socket error geben und deine 'endlosschleife' wird auf einmal ganz kurz.
    Dann ist der Rückgabewert nämlich <0


Anmelden zum Antworten