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:
Gruß Ryu1991
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: