Von Socket Zeilenweise lesen...



  • Hi,
    also ich möchte von einem Socket Zeilenweise lesen, eine Funktion die auch unter Linux verfügbar ist gibt es nicht, oder?

    Ich hab erstmal den String den ich Empfange gesplittet, aber so wirklich toll ist das nicht hat von euch jemand eine bessere Lösung Zeilenweise zu empfangen?

    Danke

    Gruß



  • Das musst du selbst machen.



  • Jedes Byte einzeln aus dem Socket lesen und gucken ob es ein Zeilenumbruch ist. Sobald es ein Zeilenumbruch ist, aufhörn.

    Das klingt vielleicht nicht sehr effektiv, aber das klappt.

    mfg.



  • Danke ich hatte sowas auch schon im Sinn...
    Allerdings hats nicht funktioniert und tuts noch immer nicht 😞

    buffer[rc] = '\0';
    
    			Temp = buffer;
    
    			for ( int i = 0; i < Temp.length(); i++ )
    			{
    				if ( Temp[i] == '\n' )
    				{
    					MsgVec.push_back(Line);
    					Line = "";
    					//std::cout << std::endl;
    				}
    				Line += Temp[i];
    				//std::cout << Temp[i];
    			}
    
    			for ( std::vector<std::string>::iterator It = MsgVec.begin(); It != MsgVec.end(); It++ )
    			{
    				std::cout << "|" << (*It).c_str() << "|" << std::endl;
    			}
    

    Kommt nur Murks raus 😞 Könnt ihr mir mal auf die Sprünge helfen bin gerade irgendwie nicht so Fit im Denken 😃

    Gruß



  • Ich versteh deinen Code nicht ganz. Ich würde es so machen:

    bool getLine(SOCKET s, std::string& line) {
        line.erase();
        for(char c; recv(s, &c, 1, 0) > 0; line += c) {
            if(c == '\n') {
                return true;
            }
        }
        return false;
    }
    

    mfg.



  • Wenn du es so machen würdest, würde ich dir empfehlen nicht das Socket Tutorial zu schreiben.



  • Hi

    @joomoo: Danke 🙂
    @Empfehlung: Da du ja scheinbar was dran auszusetzen hast: Wie sonst?!

    Gruß



  • Auf jeden Fall mehr als 1 Byte einlesen und dann sowas machen wie dein Code oben. Hab jetzt keine Lust den den Fehler zu suchen aber das solltest doch wohl selbst schaffen. Wenn nicht kannste das programmieren gleich aufgeben. 🤡



  • Empfehlung schrieb:

    Auf jeden Fall mehr als 1 Byte einlesen und dann sowas machen wie dein Code oben. Hab jetzt keine Lust den den Fehler zu suchen aber das solltest doch wohl selbst schaffen. Wenn nicht kannste das programmieren gleich aufgeben. 🤡

    Was erzählst du denn für einen Quatsch. Naja hör nicht auf ihn @ Dummie 😉



  • Empfehlung schrieb:

    Auf jeden Fall mehr als 1 Byte einlesen

    Warum?

    mfg.



  • joomoo schrieb:

    Empfehlung schrieb:

    Auf jeden Fall mehr als 1 Byte einlesen

    Warum?

    hier:
    "All three routines return the length of the message on successful completion. If a message is too long to fit in the supplied buffer, excess bytes may be discarded depending on the type of socket the message is received from (see socket(2) )."

    [edit: ROFL... in WinAPI auf die Linux manpages verweisen... ich trau mich was]

    aus der PlatformSDK Doku:
    "If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recv generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost; for reliable protocols, the data is retained by the service provider until it is successfully read by calling recv with a large enough buffer."



  • jo und was is das prob? the data is retained.



  • häh schrieb:

    jo und was is das prob? the data is retained.

    "for reliable protocols"

    "For unreliable protocols (for example, UDP) the excess data is lost" 😉
    Es steht ja nirgends dran, dass er TCP verwenden, denn wenn er UDP verwendet ist die obere Lösung schlicht & einfach falsch.



  • jo aber tcpip was er benutzt is ja reliable



  • "Es steht ja nirgends dran, dass er TCP verwenden, denn wenn er UDP verwendet ist die obere Lösung schlicht & einfach falsch."



  • 🤡



  • joomoo schrieb:

    Empfehlung schrieb:

    Auf jeden Fall mehr als 1 Byte einlesen

    Warum?

    mfg.

    Weil das extrem ineffizient ist.



  • So dramatisch ist es nicht wenn er irgendein Windows Programm bastelt, man muss es auch nicht übertreiben mit den guten Ratschlägen.



  • Empfehlung schrieb:

    joomoo schrieb:

    Empfehlung schrieb:

    Auf jeden Fall mehr als 1 Byte einlesen

    Warum?

    mfg.

    Weil das extrem ineffizient ist.

    Alternative?

    mfg.


Anmelden zum Antworten