select() erkennt Ende des Empfangsvorgangs nicht

cesupa

Erfahrenes Mitglied
Hallo,

ich hab ein Problem mit select(). Ich hab einen Client und einen Server, der mehrere Clients aufnehmen kann. Das funktioniert schonmal. Wenn er dann einen Client hat, sendet er HALLO WELT! zu ihn, dieser sendet den String dann wieder zurück. So, jetzt kommt mein Problem: Der Server empfängt immer nur 2 Bytes, dann prüft er ob sich neue Clients anmelden wollen, und empfängt weitere 2 Bytes, das soll jetzt immer so weiter gehen, bis der ganze String empfangen wurde, nur leider erkennt select() nicht, wann der Client mit dem Senden aufgehört hat! Das ganze hab ich im Prinzip so programmiert:

Code:
for(int i=0;i<this->clients;i++)
                         {
                                 if(this->s[i]==INVALID_SOCKET)
                                 continue;
                                 
                                 char buf2[3];
                                 int bytes=0;
                                         
                                         FD_ZERO(&this->fd2);
                                         FD_SET(this->s[i],&this->fd2);            //clients die am Server angemeldet sind
                                         this->timeout->tv_sec=0;
                                         this->timeout->tv_usec=1;
                                         cout<<"SELECT: "<<select(0,&this->fd2,NULL,NULL,this->timeout)<<endl;     //select() ausführen -> Download-Ende wird nicht erkannt
                                                 
                                         if(FD_ISSET(this->s[i],&this->fd2)){  //Wenn Client was gesendet hat, dann empfangen und zu buffer hinzufügen
                                             bytes=recv(this->s[i],buf2,2,0);
                                             if(bytes>0)
                                             {
                                             this->rsbytes[i]+=(bytes>0)?bytes:0;  
                                             buf2[bytes]='\0';
                                             
                                             cout<<"Empfangen: "<<buf2<<endl;
                                             
                                             if(bytes>0 && this->rsbytes[i]<=2)
                                             sbuf[i].cpy(buf2,bytes);
                                             else if(bytes>0 && this->rsbytes[i]>2)
                                             sbuf[i].add(buf2,bytes);  
                                             }
                                             else if(bytes==0)
                                             {this->error=29;csocket_kick_clients(i);return false;}           //Client hat Verbindung unterbrochen      
                                             else if(bytes<0)
                                             {this->error=31;csocket_kick_clients(i);return false;}           //SOCKET_ERROR = FEHLER             
                                             }
                                             else         //Wenn Client nichts mehr sendet, Download als Fertig kennzeichnen, ID des fertigen Downloads(n) zurückgeben
                                             {cout<<"DOWNLOAD FERTIG!"<<endl;n=(this->rsbytes[i]>0)?i:-2;this->rsbytes[i]=0;return true;}
                                             }

Diese Funktion wird im Hauptprogramm ungefähr so verwendet:

Code:
while(1)
{
//nach neuen Clients checken, wenn welche vorhanden -> an Server anmelden lassen
download();
//wenn ein download fertig, Daten ausgeben -> FERTIGER DOWNLOAD WIRD NICHT ERKANNT!
}

Hoffe ihr könnt mir bei der Sache helfen. Danke schonmal im Vorraus:)

Gruß
cesupa
 
Zurück