select funzt nicht



  • Hi!
    Es eht um folgendes. Ich habe ein Chat-Programm für die Konsole geschrieben weil ich lust dazu hatte! 😉 Der Code ist sonst auch fehlerfrei, er funktioniert nur nicht ganz. Gesendet werden Nachrichten, nur nicht empfangen.
    Der Teil des Codes sieht so aus:

    FD_ZERO(&fds);
                              FD_SET(s1, &fds);
                              select(s1, &fds, 0, 0, 0);
                              if (FD_ISSET(s1, &fds))
                              {
                                 len = recv(s1,data,strlen(data),0);
                                 data[len]='\0';
                                 if (first==true)
                                 {
                                    nick = data;
                                    first = false;
                                 }
                                 else
                                 {
                                    cout << nick << "> " << data << "\n";
                                 }
                              }
    

    Die select Funktion soll feststellen ob Daten an s1 gesendet werden, wenn ja dann sollen diese abgeholt werden. Die ersten Daten sind der nick, deswegen die if()!
    Wer weiß warum die select nicht richtig arbeitet?

    gruß,
    wer



  • nur so ein spontaner einfall: select muss mit 'höchster socketdeskriptor + 1' aufgerufen werden, und ist der rückgabewert von select nicht wichtig? -1 fehler, 0 timeout, 1-x socket oder so



  • Habe jetzt den Code geändert:

    FD_ZERO(&fds);
    FD_SET(s1, &fds);
    ret = select(s1+1, &fds, 0, 0, 0);
    if (ret)
    {
    len = recv(s1,data,strlen(data),0);
    ...
    }
    

    Mit dem Deskriptor hattest du recht. Der Rückgabewert wurde in einem Beispiel so verwendet. Es heißt der Rückgabewert ist die Anzahl der Deskriptoren auf der die Bedingung zutrifft. Es funktioniert aber trotzdem noch nicht.
    😞

    wer



  • vorsicht: if gibt _nur_ bei 0 false. du hast übrigens kein timeout angegeben! gib mal ein timeout an, und überprüfe auf fehler (-1) und timeout (0).



  • Ich habe probiert was du gesagt hast und es funktioniert immer noch nicht.
    Vielleicht habe ich es falsch angewandt.
    Poste doch mal wie dur dir diesen codeteil vorstellst.

    wer



  • Also ich hab auch schon mal so einen kleinen Konsolenchat geschrieben. Allerdings habe ich nicht select() verwendet sondern mit Threads gearbeitet. D. h. ich habe in einem Thread einfach das recv() aufgerufen, dass dann ja wartet bis was kommt und danach kann man es einfach ausgeben.



  • Das Problem ist bloß, wenn ich das so machen würde wie AJ es sagt, dann könnte man nichts schreíben solange die Anwendung bei recv() ist. Das Programm würde sich aufhängen.



  • Eben nicht. Du hast dein Hauptprogramm, in dem du die Eingabe abhandelst und in einem Thread, den du nach dem Verbindungsaufbau zum Server startest, machst du die Abwicklung des Empfangs der Daten vom Server. Du musst nur drauf aufpassen, dass du nicht gleichzeitig ausgibst und einliest, weil du ja leider nur einen Cursor hast 😉


Anmelden zum Antworten