EOF bei send/recv ???



  • hallo,

    in einem Programm von mir wird in einer Schleife nacheinander ein Zeichen aus einer Datei ausgelesen und über die Funktion send das Zeichen versendet. Das Gegenstück davon, der Client, empfängt die Zeichen nacheinander, und gibt sie aus.
    Nun zu meinem Problem:
    Ich hab bisher keine Möglichkeit gefunden, dass der Client wirklich nur so lange empfängt, wie der Server auch Zeichen verschickt. Der Client müßte also irgentwie vorher prüfen, ob noch was im stream liegt. Gibt es da nich eine Möglichkeit, die so ähnlich funktioniert wie EOF bei Dateien???.

    schon im voraus Vielen Dank!

    mfg
    #pointer#



  • es ist gerade beim senden und empfangen einfacher vor dem eigenlichem senden zu sagen wie viele zeichen empfangen werden sollen.

    alles andere im stream zu integrieren wäre eine art der codierung und in der bytefolge einfach zu unsicher.

    lg volker



  • hm...
    aber da ich die Zeichen sofort nach dem ausgelesen verschicke, kann ich ja nicht wissen wieviele Zeichen ich noch auslesen werden.
    oder kann ich das irgentwie vorher ermitteln?



  • Du kannst mit dem Befehl shutdown auf der Seite wo geschrieben wird den Schreibkanal schliessen. Das kommt auf der lesenden Seite dann rüber wie ein EOF (0 Zeichen gelesen).



  • wie funktioniert denn der Befehl shutdown?



  • send und recv sollten immer in schritten senden, ich schlage mal 256 bytes vor. Der erste byte, wird nun immer sagen wieviel bytes noch folgen. Sobald dieser nun < 255 ist, weiß der Empfänger, das das aktuelle Paket das letzte ist.

    Beispiel für 321 Byte Datei:

    send(socket,pBuffer,256,0);
    // empfänger: recv(socket,pBuffer,256,0);
    send(socket,pBuffer,67,0);
    // empfänger immer noch recv(socket,pBuffer,256,0);
    

    Jetzt macht der Empfänger aber folgendes:

    if (pBuffer[0] < 255)
    {
    // datei mit dem letzten datenpaket beenden
    }
    

    Ich hoffe das war verständlich 🙂

    mfg.

    edit: die antwort mit shutdown war noch nicht da. Der Befehl ist in der MSDN erklärt. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/shutdown_2.asp



  • Frickler



  • aja...danke joomoo.
    wie kann ich es denn dann auf der anderen Seite prüfen, wenn ich shutdown beim Server eingesetz habe?

    tmp=recv(...);
    

    ist dann tmp mit EOF definiert, oder in dem Buffer, wo das von recv empfangene steht?



  • #pointer# schrieb:

    aja...danke joomoo.
    wie kann ich es denn dann auf der anderen Seite prüfen, wenn ich shutdown beim Server eingesetz habe?

    tmp=recv(...);
    

    ist dann tmp mit EOF definiert, oder in dem Buffer, wo das von recv empfangene steht?

    tmp ist dann genau 0

    mfg.



  • welches Flag muss ich da denn jetzt genau benutzen, um zu sagen, dass jetzt nichts mehr kommt?

    sorry für die vielen Fragen, aber es ist schon ziemlich wichtig für mich 🙄



  • #pointer# schrieb:

    welches Flag muss ich da denn jetzt genau benutzen, um zu sagen, dass jetzt nichts mehr kommt?

    sorry für die vielen Fragen, aber es ist schon ziemlich wichtig für mich 🙄

    Server;

    // accecpt
            send(Socket,"abc",4,0);
            shutdown(Socket,SD_SEND); // Socket schließen
    

    Client:

    // connect
            char buf[4];
            recv(Socket,buf,4,0); // normale übertragung
            int a = recv(Socket,buf,4,0); // diesmal wird a gleich 0 sein
            std::cout << a;
    

    Schau dich in der MSDN nochmal um, falls noch fragen offen sind.

    mfg.



  • also ich finde es nicht gut den socket jedesmal zu schliessen und "recv(socket,pBuffer,256,0);" sagt nicht das da immer 256 zeichen dirin liegen auch wenn 256 zeichen gesendet werden.

    zu prüfen auf /0 find ich auch keine gute lösung.

    warum lässt es sich nicht im vorfeld ermitteln wie viele zeichen gesendet werden... mal dumm gefragt?

    und send, rev ohne thred... da klemmt doch alles!!



  • vdittrich schrieb:

    also ich finde es nicht gut den socket jedesmal zu schliessen

    Wieso nicht? Wenn das Programm danach fertig ist?

    und "recv(socket,pBuffer,256,0);" sagt nicht das da immer 256 zeichen dirin liegen auch wenn 256 zeichen gesendet werden.

    Ja, hat auch keiner gesagt.

    zu prüfen auf /0 find ich auch keine gute lösung.

    Ist es auch nicht bei binär Dateien.

    warum lässt es sich nicht im vorfeld ermitteln wie viele zeichen gesendet werden... mal dumm gefragt?

    Ja das ist eigentlich die beste Lösung: Vorher die DAteigröße am besten als __int64 rüberschicken und dann solange empfangen, bis man alles hat.

    und send, rev ohne thred... da klemmt doch alles!!

    Darum geht's ja auch gar nicht.

    mfg.



  • ich will ja auch nicht streiten, kenne die anforderung nicht und wenn ich eine classe entwickle, dann sollte sie allgemein sein.

    geade bei socket verwende ich lieber threads, schon von der seite das man nie weis ob die "leitung" klemmt.

    abbruchzeichen zu senden bzw. darauf zu prüfen halt ich für eine schlechte lösung... meine ansichten



  • vdittrich schrieb:

    ich will ja auch nicht streiten

    Ich auch nicht. Das mag ich immer an Foren nicht: Niemand hört deinen Tonfall. Einige Sachen können nett gesagt was ganz anderes bedeuten als nicht nett oder so.

    , kenne die anforderung nicht und wenn ich eine classe entwickle, dann sollte sie allgemein sein.

    Ich glaube er will erst mal versuchen ein einfaches Programm zu schreiben, als gleich das ganze in eine Klasse zu packen.

    geade bei socket verwende ich lieber threads,

    Ich auch 😃

    abbruchzeichen zu senden bzw. darauf zu prüfen halt ich für eine schlechte lösung... meine ansichten

    ist nicht die ideallösung, vor allem wenn danach noch was kommen soll, da hast du Recht.

    mfg.


Anmelden zum Antworten