Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)

  Alt 20. Jul 2008, 10:47
Zitat von Mr_G:
Mir stellt sich die Frage ob das nicht viel zu aufwendig ist bei jedem auslösen des Events die Liste zu durchsuchen.
Du durchsuchst die Liste nicht! WSAWaitForMultipleEvents gibt dir den Array-Index des Events zurück.
Zitat von Mr_G:
Die Funktion sieht interessant aus aber ich verstehe leider nicht wie ich mit FD_SET umgehen muss. In der WinSock Unit handelt es sich bei FD_SET um eine procedure die ein Socket übergeben bekommt.
Das ist zumindest in meiner Unit WinSock ausführlich dokumentiert: Es gibt einen Record TFD_SET und eine Routine (eine Art Konstruktor) FD_SET. Wegen des Namenskonflikts gibt es keinen Typen FD_SET, du musst TFD_SET verwenden.
Zitat von Mr_G:
Das hört sich irgendwie nicht so gut an... ich habe mir dazu mal das passende Beispiel in der MSDN angesehen und so wie ich das verstehe würde sich das bei vielen Verbindungen auch schwer tun. Ich hab das ganze nämlich so vestanden, dass dabei auch für jedes Socket ein Event erzeugt wird und anschließend alle Sockets durchlaufen werden. Dabei wird bei jedem Socket 1 Sekunde auf das entsprechende Event gewartet und wenn etwas signalisiert wurde, wird WSAEnumNetworkEvents genutzt um herauszufinden was alles seit dem letzten Aufruf passiert ist. Ich kann mich um die Uhrzeit auch schon völlig verschätzen aber für mich würde das bedeuten, das z.B. im Falle von 30 Verbindungen, bei denen Verbindung 30 Daten überträgt, im schlechtesten Falle erst für jede Verbindug davor gewartet wird (29 Sekunden lang !?) und dann evtl. aufgetretene Events bei Verbindung 30 bearbeitet werden.
Das hast du falsch verstanden. Die Idee ist: Entweder du verwendest für jeden Socket ein Event (schnell, aber etwas resourcenintensiver) oder ein Event für alle Sockets. Bei letzterer Möglichkeit weißt du allerdings nicht, welcher Socket etwas von dir will. Dazu verwendest du WSAEnumNetworkEvents.
Zitat von Mr_G:
Ich hab mich auch da (Threads) schonmal umgesehen gehabt und meine da sowas wie WorkerThreads bzw. einen Threadpool gefunden zu haben. Ich glaube es war in dem Tutorial von Luckie. Leider weiß ich auch dabei nicht ob es sich um eine echte Alternative handelt.
Du kannst hier nicht direkt einen Threadpool verwenden, denn du bräuchtest für jeden Socket einen eigenen Thread. Das ist aber eine Zumutung für das System, wenn du viele Sockets hast.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat