Zum Inhalt springen

wie funktioniert select()??


Net-srac

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D. 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...