Problem mit Socket-Chat



  • Ich habe mir ein Konsolenbasierendes SOCKET Chat-Programm geschrieben und stehe nun vor einem Problem. Gehen wir von 2 Chatpartnern A und B aus. Immer, wenn A etwas eingibt und B gleichzeitig mit der Eingabe noch nicht fertig war, erscheint der eingegebene Text von A auf EINER Zeile mit dem, was B eingeben wollte in der Konsole von B. Wie kann ich das verhindern?

    Win32-Konsole.



  • Speicher die werte zuerst. Wenn dann \0 gesendet wird wird das angezeigt.



  • Du meinst im Puffer oder? Da werden sie ja sowieso schon gespeichert.



  • lk meint wohl eher, dass der Text von User A erst dann ausgegeben werden soll, wenn User B mit Return seine Eingabe beendet hat.



  • Wie könnte man das am besten implementieren? Das sind die beiden Threads, die ich zur Kommunikation benutze:

    DWORD WINAPI reader(PVOID pParam)
    {
        char line[BUF_SIZ];
        SOCKET s;
    
        s = *(SOCKET*)pParam;
    
        while(fgets(line, sizeof(line) - 3, stdin))
        {
            cut(line);
            strcat(line, "\r\n");    /* passt sicher */
            if (send(s, line, strlen(line), 0) == -1)
                return 1;
        }
    
        return 0;
    }
    
    DWORD WINAPI writer(PVOID pParam)
    {
        char  buffer[BUF_SIZ];
        int bytes;
        SOCKET s;
    
        s = *(SOCKET*)pParam;
    
        while((bytes = recv(s, buffer, sizeof(buffer), 0)) > 0)
            fwrite(buffer, 1, bytes, stdout);
    
        return 0;
    }
    


  • Zeile 28:
    Schreibe die empfangenen Bytes nicht direkt in den Ausgabestrom sondern in eine separate Variable. Hier macht sich ne Queue ganz gut. Die STL bietet dazu die Klasse queue 😃

    ca. Zeile 11:
    wäre wohl in dem Code derzeit der beste Platz für die Ausgabe, in dem du deine separate Variable ausgibst oder ueber die queue iterierst.

    PS: nimm den Code, den du aus dem Internet herkopierst, ruhig mal Zeile für Zeile auseinander und schau, was da genau abläuft 😉


Anmelden zum Antworten