Socket-Programmierung .... Select() -> immer SOCKET_ERROR
-
ich steh gerade ziemlich auf dem Schlauch und kann den Fehler nicht entdecken.
also ich bin dabei einen simplen server zu schreiben der mehre clients gleichzeitig handeln kann... solange kein Client am server angemeldet ist, warte ich mit dem blockierende accept. sobald jedoch ein client vorhanden ist, versuche ich mit select() zu ermitteln ob auf einem socket aus der menge fdset daten angekommen sind, die gelesen werden können. und hier ist mein problem zu hause ... select() liefert mir immer eine SOCKET_ERROR ...mein code sieht im wesentl. wie folgt aus:
int main(int argc, char * argv[]){ WSADATA wsaData; List allClients = mkEmptyList(); /* Liste in der die Clients gespeichert werden */ FD_SET fdSet; struct sockaddr_in server; struct timeval to; int ServerSocket, fd, ID=1,i,int anzClients=0,ServerPort = StandardPort; /* Initialisiere TCP für Windows ("winsock") */ #ifdef _WIN32 if (WSAStartup ( MAKEWORD (1, 1), &wsaData) != 0) { fprintf( stderr, "Failed to init windows sockets\n"); exit(1); } #endif /*Socket erstellen*/ ServerSocket = socket( PF_INET, SOCK_STREAM, 0); if (ServerSocket < 0) { perror( "failed to create socket"); exit(1); } /* Erzeuge die Socketadresse des Servers */ memset( &server, 0, sizeof (server)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl( INADDR_ANY); server.sin_port = htons((unsigned short int)ServerPort); /* Erzeuge die Bindung an die Serveradresse */ if (bind( ServerSocket, (struct sockaddr*)&server, sizeof( server)) < 0) { perror( "can't bind socket"); exit(1); } /* Teile dem Socket mit, dass Verbindungswünsche * von Clients entgegengenommen werden */ listen( ServerSocket, 10); /* Bearbeite die Verbindungswünsche von Clients * in einer Endlosschleife */ for ( ; ; ) { Item client; int server_recv = 0, rc, newClientSocket; struct sockaddr_in cli; /* cli - ClientDaten (IP,Port,Fam.) */ int cli_Size=sizeof(cli); /* wenn kein Client am Chatserver angemeldet auf Verbindung mit blockierendem accept warten */ if (isEmptyList(allClients)) { printf("Warte auf Verbindungen\n"); /* Der Aufruf von accept() blockiert solange, bis ein Client Verbindung aufnimmt */ fd = accept( ServerSocket, (struct sockaddr*)&cli, &cli_Size); if (fd < 0) { perror( "accept failed"); } else { printf("Verbindung aufgebaut\n"); /* Client in ClientListe eintragen */ client = init(&ID,fd); printItem(client); allClients = insertListElement(allClients, init(&ID,fd)); printf("client from %s", inet_ntoa(cli.sin_addr)); send(fd,"MSG: Verbindung angenommen!\n",29,0); } } /* mind. ein Client vorhanden ... * Behandlung der Verbindungswünsche mit Select() */ else { FD_ZERO(&fdSet); FD_SET(ServerPort,&fdSet); anzClients = numOfItems(allClients); for (i=0;i<anzClients;i++){ /* Fügt alle Client-Sockets in die Menge fdSet ein */ client = getItemAtIndex(allClients,i+1); FD_SET(client.ClientSocket,&fdSet); } to.tv_sec=30; to.tv_usec=0; rc=select(getMaxSocket(allClients,ServerSocket)+1,&fdSet,NULL,NULL,&to); if(rc==SOCKET_ERROR) { printf("Fehler: select, fehler code: %d\n",WSAGetLastError()); return 1; } /* Msg auf dem ServerPort => verbindung annehmen (sofern er platz hat) */ if(FD_ISSET(ServerSocket,&fdSet)) { if (numOfItems(allClients) < MAX_CLIENTS) { /* noch Platz vorhanden => Verbindung annehmen */ newClientSocket = accept(ServerSocket,(struct sockaddr*)&cli,&cli_Size); if (newClientSocket == -1) { perror("accept() failed"); return 1; } allClients = insertListElement(allClients, init(&ID,fd)); printf("client from %s", inet_ntoa(cli.sin_addr)); } else { /* Verbindung ablehnen; Kapazität erschöpft */ printf("Server-Capacity is full! Try it again in few min! \n"); } } /* Überprüfen welche Client-Sockets im fdset sind */ anzClients = numOfItems(allClients); for (i=0;i<anzClients;i++){ if (FD_ISSET((unsigned int)getItemAtIndex(allClients,i).ClientSocket,&fdSet)) ... } } return 0; }
es würde mich sehr freuen wenn mir wer weiterhelfen kann
-mfg manga
-
und welcher fehler code?
-
FehlerCode: 10038
-
Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist.
-
ich hab den fehler bis jetzt noch nicht lokalisiert, die einzige neue erkenntnis ist, dass es unter linux läuft und unter winxp liefert select immer noch den SOCKET_ERROR ...
[edit] oh man ich depp
... habs gefunden thx @invalid handle
[/edit]
-mfg & gn8 manga
-
Schön das Du uns unwissende daran teilhaben läßt.
-
@Unix-Tom hör ich da etwa ironie in deinen worten
es war schon spät und ich mit nem halben bein im bettchen ...
also eigentl ist mir dass ja zu peinlich aber nuja *rotanlauf
... als ich den hinweis von invalid handle las, hab ich sofort folgende stelle angeschaut ...
FD_ZERO(&fdSet);
FD_SET(ServerPort,&fdSet);und was haben meine augen da gesehen ... ich depp habe den port anstatt den socket hinzugefügt ...
was mich noch interessieren würde, ist, wo man zu dem fehlercode die fehlermsg herbekommt? gibt es da eine funktion die die passende fehlermsg ausspuckt?!
-mfg manga
-
FormatMessage oder das Tool benutzen was bei Visual C++ dabei ist: errlook.exe