MehrClienten Server
-
Hallo,
ich hab einen server geschrieben der mit mehrern clienten kommunizieren soll1
Mein server verbindet sich auch ganz wunderbar mit den clients aber kommuniziert nur mit dem der sich als erstes verbunden hat, bei den andern sendet er nur einmal dann nicht mehrHier die funktion der die Verbindungen annimmt:
int myselect(SOCKET listensocket) { struct timeval timeout; timeout.tv_sec = 20; // in Sekunden timeout.tv_usec = 10; // in Micro-Sekunden FD_SET readset; FD_ZERO(&readset); FD_SET(listensocket,&readset); if(select(1,&readset,NULL,NULL,&timeout) <=0) { return 35; //timeout } else { if(!(FD_ISSET(listensocket, &readset))) /*socket_one zum lesen bereit?*/ { cout<<"fehler36"<<endl; return 36; } else { SOCKET sd=accept(listensocket,NULL,NULL); if(sd!=SOCKET_ERROR) { //soooo in vecotor schreiben! while(editlist==true){Sleep(200);} myclientlist.push_back(Connection(sd)); //socket in die liste hinzufügen!! cout << "Socket " << sd << " became readable; handling it." << endl; cout<<"krass verbindung angenommen"<<endl; } else { cout<<"fehler16"<<endl; return 16; } } } return 0; }hier die mit ihnen kommunieziert
int myinit() { int size=15; char* buffer = new char[ size ]; char* buff = new char[ 3 ]; buffer="02 lifebit"; clientlist::iterator it = myclientlist.begin(); while (it != myclientlist.end()) //an alle anstehenden was senden { int nBytes = send(it->sd,buffer,(size+1),0); ///senden if(nBytes==-1) { cout<<"fehler beim senden von"<< it->sd <<it->lifebit<<endl; } Sleep(200); nBytes = recv(it->sd,buff,size,0); if (buff[0]=='0' && buff[1]=='3') { cout << buff <<"empfangen von " << it->sd <<endl; //cout<<buff<<endl; buff="00"; } else { cout<<"nicht empfangen von"<< it->sd <<it->lifebit<<endl; it->lifebit++; if(it->lifebit>5) { cout<<"verbindung gelöscht/////////////////////////////////"<< it->sd <<endl; myclientlist.erase(it); return 12; } } //if(nBytes!=-1) it++; Sleep(1000); } return 0; }beide funktionen werden jeweils von einem eigenen thread in einer while schleife auf aufgerufen
hier noch die struktur für die clienten
struct Connection { int status; SOCKET sd; int lifebit; bool init; Connection (SOCKET sd_) : sd(sd_), nCharsInBuffer(0),lifebit(0) {} }; typedef vector <struct Connection> clientlist; clientlist myclientlist;so wenn ich den server starte und einen clienten funzt das wunderbar..
wenn ich den zweiten starte sendet der server einmal erfolgreich zum server!
dann läuft er 5 mal durch die while mit erfolglosen senden und empfangen und löscht dann die verbindung!
ich hoffe ihr könnt mir helfen
verbesserungsvorschläge nehme ich auch gern entgegen!
-
Bin über deinen Code nur grob drübergeflogen, aber sieht alles ok aus. Was noch nützlich wäre zu wissen, wann und wie oft die Funktion myinit aufgerufen wird.
Individuum schrieb:
wenn ich den zweiten starte sendet der server einmal erfolgreich zum server!
Meinst du das wirklich so oder hast du dich vertippt/verdacht?
Und sicher, dass mit myclientlist nicht irgendwo Unfug machst? Weil sonst kann ich soweit keinen Fehler sehen :p
-
guten morgen,
Badestrand schrieb:
Bin über deinen Code nur grob drübergeflogen, aber sieht alles ok aus. Was noch nützlich wäre zu wissen, wann und wie oft die Funktion myinit aufgerufen wird.
myinit wird zur zeit in einer while schleife aufgerufen
Badestrand schrieb:
Individuum schrieb:
wenn ich den zweiten starte sendet der server einmal erfolgreich zum server!
Meinst du das wirklich so oder hast du dich vertippt/verdacht?
ohja, da hab ich mich verdacht!
Wenn ich den zweiten clienten verbinde, sendet der server dem clienten einmal erfolgreich das lifebit.
Der client soll dann nach 200ms zurücksenden, aber das schlägt dann fehl, ist es vll möglich das der andere client die nachricht abfängt?!Badestrand schrieb:
Und sicher, dass mit myclientlist nicht irgendwo Unfug machst? Weil sonst kann ich soweit keinen Fehler sehen :p
hmm.. da bin ich mir eigentlich realiv sicher, der server benutzt ja die zweite verbindung, es wird ja der fehler angezeigt dass das senden und empfangen fehl schlägt
-
individuum schrieb:
Wenn ich den zweiten clienten verbinde, sendet der server dem clienten einmal erfolgreich das lifebit.
Der client soll dann nach 200ms zurücksenden, aber das schlägt dann fehl, ist es vll möglich das der andere client die nachricht abfängt?!Hast du mal auf der Client-Seite überprüft, ob diese Nachricht überhaupt angekommen ist? (und ob er überhaupt Zeit hatte, darauf zu reagieren)
Badestrand schrieb:
Und sicher, dass mit myclientlist nicht irgendwo Unfug machst? Weil sonst kann ich soweit keinen Fehler sehen :p
hmm.. da bin ich mir eigentlich realiv sicher, der server benutzt ja die zweite verbindung, es wird ja der fehler angezeigt dass das senden und empfangen fehl schlägt
Das besagt nur, daß der Server noch einen brauchbaren Socket hat - aber ob der noch mit dem Clienten verbunden ist, ist die andere Frage.
-
wirst bekloppt!!!
es lag an dem
char="00"in meinem jugendlichen leichtsich wollt ich da die ersten beiden stellen einfach ne null reinschreiben...........
ohne das klappt es!
nun kann mir ja noch einer sagen was da passiert ist?? mit dem char="00" ?
wie setzt ich den buff (char[]) denn wieder auf null?
-
individuum schrieb:
nun kann mir ja noch einer sagen was da passiert ist?? mit dem char="00" ?
Damit wird der Zeiger 'buff' umgebogen auf das String-Literal "00" gesetzt.
wie setzt ich den buff (char[]) denn wieder auf null?
strcpy() oder Kollegen.
(btw, das selbe Problem tritt auch bei 'buffer="02 lifebit" auf)
PS: Und eventuell solltest du anstelle der char-Arrays std::string verwenden, wo es möglich ist.