Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
bool CServer::run() { //..........Socketbuffer füllen......................... FD_ZERO(&Server.Socketbuffer); //Inhalt zunächst leeren for (int i=0; i<Server.maxClients; i++) if (!Server.Clients[i].free) FD_SET(Server.Clients[i].Clientsocket,&Server.Socketbuffer); //Alle Alten clienten wieder hinzufügen FD_SET(Server.Serversocket,&Server.Socketbuffer); //Neuen Clienten auch hinzufügen! //..........Socketbuffer füllen......................... //....................Events Abfragen.................. if (select( 0,&Server.Socketbuffer,NULL,NULL,NULL)==SOCKET_ERROR ) return false; //....................Events Abfragen.................. ... |
Zitat
Du kannst ja auch einfach eine beschreibung des fehlers ausgeben:
schau dir mal die FUnktion FormatMessage an.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
int select( int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout ); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
DWORD BasicServer::empfangenClients(LPVOID p) { BasicServer* server = static_cast<BasicServer*>(p); server->status = READY; TIMEVAL time = { 3, 0 }; fd_set readset; while(server->status = READY) { FD_ZERO(&readset); FD_SET(server->Socket, &readset); for(std::list<BasicServerClient*>::iterator temp = server->ClientList.begin(); temp != server->ClientList.end(); temp++) { if((*temp)->status == READY) FD_SET((*temp)->Socket, &readset); } server->ClientList.unlock(); if(SOCKET_ERROR == select(NULL, &readset, NULL, NULL, &time)) server->geterror(); for(std::list<BasicServerClient*>::iterator temp = server->ClientList.begin(); temp != server->ClientList.end(); temp++) { if(((*temp)->status == READY) && FD_ISSET((*temp)->Socket, &readset)) (*temp)->ClientCallback(); } server->ClientList.unlock(); } } |
Zitat
schau mal auch ob die Socket, die du einfügst auch korrekt sind.
C-/C++-Quelltext |
|
1 |
select(NULL, &readset, NULL, NULL, &time); |
C-/C++-Quelltext |
|
1 |
select(0, &readset, NULL, NULL, &time); |
Zitat von »"Stier X"«
Ich dachte das waere nur eine Stielfrage, ob man NULL oder 0 schreibt. Muesste doch im Prinzip das gleiche sein...
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//------------------------Clientstructur-------------------------------- struct SClient { int id; //Die zugeteilte ID char Name[20]; //Der Name des Clienten (wird beim login gleich empfangen) SOCKET Clientsocket; //Der Socket des Clienten bool free; //Ob der Client schon benutzt ist oder frei ist SClient(){ free=true; Clientsocket=INVALID_SOCKET; } }; //------------------------Clientstructur-------------------------------- //------------------------Serverstructur-------------------------------- struct SServer { char Servername[20]; //Der Servername int Port; //Der Serverport int numClients; //Anzahl der Clienten, die online sind int maxClients; //Anzahl der maximalen Clienten SClient* Clients; //dynamischer Speicher für die Clienten! SOCKET Serversocket; //Der Serversocket SOCKADDR_IN Serveradresse; //Die Serveradresse FD_SET Socketbuffer; //Der Socketbuffer (wird jedes mal neu gefüllt) }; //------------------------Serverstructur-------------------------------- |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
//-----------------------Client einloggen------------------------------------------- bool CServer::Login(int id) { //....Structur füllen.... Server.Clients[id].free=false; Server.Clients[id].id=id; Server.Clients[id].Clientsocket=accept(Server.Serversocket,NULL,NULL); recv(Server.Clients[id].Clientsocket,Server.Clients[id].Name,21,0); cout << "Neuer Client: " << Server.Clients[id].Name << endl; //....Structur füllen.... return true; } //-----------------------Client einloggen------------------------------------------- //-----------------------Server laufen lassen--------------------------------------- bool CServer::run() { //..........Socketbuffer füllen......................... FD_ZERO(&Server.Socketbuffer); //Inhalt zunächst leeren FD_SET(Server.Serversocket,&Server.Socketbuffer); //Neuen Clienten auch hinzufügen! for (int i=0; i<Server.maxClients; i++) if (!Server.Clients[i].free && Server.Clients[i].Clientsocket!=INVALID_SOCKET) { FD_SET(Server.Clients[i].Clientsocket, &Server.Socketbuffer); //Alle Alten clienten wieder hinzufügen } //..........Socketbuffer füllen......................... //....................Events Abfragen.................. if (select( 0,&Server.Socketbuffer,NULL,NULL,NULL)==SOCKET_ERROR) return false; //....................Events Abfragen.................. //............Prüfen ob ein Neuer Client da ist........ if(FD_ISSET( Server.Serversocket, &Server.Socketbuffer )) { //neuer Client Login(getfreeID()); //neue id suchen und einloggen } //............Prüfen ob ein Neuer Client da ist........ //............Messages weiterleiten an eine id......... for (int i=0; i<Server.maxClients; i++) { if (Server.Clients[i].free) continue; if (FD_ISSET(Server.Clients[i].Clientsocket,&Server.Socketbuffer)) { SHeader Header; if (recv(Server.Clients[i].Clientsocket,(char*) &Header,sizeof(SHeader),0)==SOCKET_ERROR) { //Client ist nich mehr da! Server.Clients[i].free=true; closesocket(Server.Clients[i].Clientsocket); Server.Clients[i].id=50; cout << Server.Clients[i].Name << " hat sich abgemeldet!" << endl; }else{ //Client hat etwas geschickt! void* packet; recv(Server.Clients[i].Clientsocket,(char*) &packet,Header.size,0); cout << (char*) packet << endl; if (Header.empfaenger==ALL) { for (int x=0; x<Server.maxClients; x++) { send(Server.Clients[x].Clientsocket,(char*) &Header, sizeof(SHeader),0); //Header schicken send(Server.Clients[x].Clientsocket,(char*) &packet, Header.size,0); //Paket schicken } }else{ send(Server.Clients[Header.empfaenger].Clientsocket,(char*) &Header, sizeof(SHeader),0); //Header schicken send(Server.Clients[Header.empfaenger].Clientsocket,(char*) &packet, Header.size,0); //Paket schicken } } } } //............Messages weiterleiten an eine id......... return true; } //-----------------------Server laufen lassen--------------------------------------- |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//------------------------Setzt die Maximale Anzahl von Clients--------------------- bool CServer::setMaxClients(int num) { Server.maxClients=num; Server.Clients = new SClient[Server.maxClients+1]; for(int i=0;i<Server.maxClients;i++) { Server.Clients[i].Clientsocket=INVALID_SOCKET; Server.Clients[i].free=true; } return true; } //------------------------Setzt die Maximale Anzahl von Clients--------------------- |
C-/C++-Quelltext |
|
1 2 3 4 |
//Client hat etwas geschickt! void* packet; recv(Server.Clients[i].Clientsocket,(char*) &packet,Header.size,0); |
C-/C++-Quelltext |
|
1 2 |
Server.Clients[id].Clientsocket=accept(Server.Serversocket,NULL,NULL); recv(Server.Clients[id].Clientsocket,Server.Clients[id].Name,21,0); |
Werbeanzeige