Net-srac Geschrieben 31. Oktober 2002 Geschrieben 31. Oktober 2002 Hallo, ich plage mich seid gestern mit der select() funktion rum, steige aber nicht dahinter, wie ich sie anwende. Ich hab einen Array mit sockethandlen, starte von jedem socket einen connect, und will diesen auf schreibbarkeit überprüfen. Am besten wäre ja, wenn ich den socket, bei dem der connect als erstes geklappt hat herausbekomme, denn dafür soll die select funktion eigentlich da sein oder? Kann mir von euch jemand beschreiben, wie ich das machen kann? Bitte keine Links auf MSDN o.ä. Das schau ich mir schon die ganze Nacht an, komme aber nicht weiter. thnx in advance Zitieren
vinc Geschrieben 31. Oktober 2002 Geschrieben 31. Oktober 2002 schade jetzt wollte ich gerade einen link rausschicken :OD du siehst doch am rückgabewert von connect (), ob selbiger mit dem socket funktioniert hat (>=0) und folglich mit welchem socket als erstes ein connect geklappt hat. nun, wie auch immer. ich hab mal ein bisserl was zusammen geschustert, was dir hoffentlich hilft: .... const int nPortCounter = 5; struct fd_set writefds; struct timeval timeout; int selectres; /* Socket */ for (i = 0; i < nPortCounter; i++) { if ((nSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0) { printf ("Socket error!\n"); return -1; } } /* Connect */ for (i = 0; i < nPortCounter; i++) { if (connect (nSocket, (struct sockaddr*)&sin, sizeof (sin)) < 0) { printf ("Connect error!\n"); printf ("%d\n", WSAGetLastError ()); return -1; } } /* Select */ FD_ZERO (&writefds); for (i = 0; i < nPortCounter; i++) { FD_SET (nSocket, &writefds); } timeout.tv_sec = 2; timeout.tv_usec = 0; if ((selectres = select (0, NULL, &writefds, NULL, &timeout)) < 0) { printf ("Select error!\n"); return -1; } if (selectres == 0) { printf ("Select timeout!\n"); return -1; } else { printf ("anzahl schreibfähiger sockets: %d\n", selectres); for (j = 0; j < nPortCounter; j++) { if (FD_ISSET (nSocket[j], &writefds)) { printf ("%d ok\n", nSocket[j]); } } } .... jetzt hat man 5 sockets, die im struct writefds eingetragen sind und mit denen jeweils ein connect () stattgefunden hat. soweit, sogut. das ist noch nicht richtig spannend . interessant wird es, wenn du die schleife um connect () abänderst z.b. nach: for (i = 2 ; i < nPortCounter; i++) {... jetzt sind nur noch 3 der 5 sockets connected. der select-aufruf prüft nun, ob die im struct angegebenen sockets schreibfähig/verbunden sind. wenn ein socket das nicht ist, wird dieser aus dem struct entfernt. der "verbliebene" struct ist praktisch das ergebnis von select (). hier wären die sockets mit dem index 0 und 1 nicht verbunden, also fliegen sie aus dem struct. das wars. hoffe das war hilfreich gruß vinc :marine Zitieren
Net-srac Geschrieben 1. November 2002 Autor Geschrieben 1. November 2002 Yep, hat geholfen, jetzt hab ich das prinzip von select verstanden. Hab es so gebaut, und es funktioniert... ... fast. Also, ich hab 2 Netzwerkkarten 172.27.x.x , 192.168.x.x. Wenn ich den connect auf einen host mit 172.27.x.x leite spuckt mir mein Prog jetzt auch die IP aus, die mit dem host verbunden ist. Wenn ich nun aber noch über einen ISDN adapter eine Verbindung zum internet aufbaue kommt eine dritte IP zu den zu überprüfenden hinzu. Starte ich jetzt mein programm liefert mir select ein "0" zurück, obwohl ich ja auch wieder ein connect mit meiner 172.27.... karte aufbaue, wie vorher. Warum klappt das spielchen mit 2 ips wunderbar, aber mir 3 nicht?! Könnte das an der ISDN karte liegen? Zitieren
Net-srac Geschrieben 1. November 2002 Autor Geschrieben 1. November 2002 Hab es schon gelöst. Es war ein problem des ndiswan treibers. Ich hab in der 192er adresse keine Routingeinstellungen vorgenommen. Als ich mich dann mit dem internet verbunden hab, wurden alle packete, egal wohin, ins internet versandt. Jetzt klappts wunderbar. Thnx Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.