Server kickt alle Clienten, wenn einer Disconnected

Ryu1991

Erfahrenes Mitglied
Hi, ich habe eine Art Chatserver geschrieben. Nun habe ich folgendes Problem: Sobald sich einer der verbundenen Clienten trennt kickt der Server alle anderen noch angemeldeten Clienten und ich komme einfach nicht auf die Lösung warum, ich hoffe ihr könnt mir helfen, hier der Entsprechende Codeabschnitt:
C++:
void nachrichtenpublizieren(){
    vector<SOCKET>::iterator vi = Clienten.begin();
	int biggestclient = 0;
	int i = 0, j = 0, rc = 0;
	char buffer[1024];
	fd_set rfds;
	struct timeval tv;

    memset(&rfds, 0, sizeof rfds);
    memset(&tv, 0, sizeof tv);

	/* select für Clients vorbereiten */
	biggestclient=0;
	FD_ZERO(&rfds);
	for (i=0;i<Clienten.size();i++){
		if (Clienten[i]){
			FD_SET(Clienten[i], &rfds);
		}
		if (Clienten[i]>biggestclient){
			biggestclient=Clienten[i];
		}
	}
	tv.tv_sec = 1;
	tv.tv_usec = 0;

	/* bei Leseversuch auf einen Client , Nachricht einlesen und allen schicken */
	if (select(biggestclient+1, &rfds, NULL, NULL, &tv)>0) {
	    vi = Clienten.begin();
		for (i=0;i<Clienten.size();i++){
			if (FD_ISSET(Clienten[i],&rfds)){
				memset(buffer,0,BUFFER_SIZE);
				recv(Clienten[i],buffer,BUFFER_SIZE,0);
				vi = Clienten.begin();
				for (j=0;j<Clienten.size();j++){
					rc = send(Clienten[j],buffer,strlen(buffer),0);
					if(rc==0){
                        cout << "Client: " << (int) Clienten[j] << " disconnected\n";
                        closesocket(Clienten[j]);
                        Clienten.erase(vi);
                        vi--;
                        j--;
                    }
                    if(rc==SOCKET_ERROR){
                        cout << "Fehler: recv, fehler code: " << WSAGetLastError() << endl;
                        closesocket(Clienten[j]);
                        Clienten.erase(vi);
                        vi--;
                        j--;
                    }
                    vi++;
				}
				cout << buffer << endl;
			}
		}
	}
}

Gruß Ryu1991
 
Zuletzt bearbeitet von einem Moderator:
Ich weiss nicht, ob das schon das Problem ist, aber du greifst auf den Iterator vi zu, nachdem du ihn gelöscht hast! Nach erase ist der Iterator nicht mehr zu gebrauchen. Aber üblicherweise gibt erase einen Iterator auf das nächste Element zurück.
 
Danke für den Hinweis, aber das scheint es nicht gewesen zu sein, das Problem besteht immer noch :(
Gruß Ryu1991
 
Zurück