![]() |
Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Hallo zusammen...
Nachdem ich mir ![]() Möglichkeit 1: Ich arbeite mit WSAAsyncSelect und übergebe ein Fensterhandle, das eine Message bekommt, die über das enstpechende Ereignis informiert, und gleich das Sockethandle mitliefert. Problem: Ich habe kein Fenster und ich weiß nicht ob ![]() Möglichkeit 2: Ich arbeite mit Events und setze für jedes Socket ein Event woraufhin ich mit WSAWaitForMultipleEvents darauf warte das eines ausgelöst wird. Das Problem, das ich hier sehe: Ich kenne nur das auslösende Event und nicht das Sockethandle... ich müsste mir also ne Liste basteln und bei jedem Event nach dem Socket suchen :shock: ... das kanns ja auch nicht sein. Möglichkeit 3: Ich erzeuge für jedes Socket einen Thread der einfach wartet. Probleme könnten hier Overhead und Sychronisation sein. So... und nun die große Frage: Wie macht man es richtig? |
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Wenn du sowieso eine Nachrichtenschleife hast, würde ich WSAAsyncSelect verwenden.
|
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Zitat:
|
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Ich vermute mal, dass der Service handgestrickt ist, also ohne VCL. Dann würde ich WSAEventSelect nehmen.
Aus dem Event den Socket zu finden, ist kein Problem. Du speicherst in einer Liste die Sockets und die Event-Handles. WSAWaitForMultipleEvents gibt bei Erfolg den Index des Events, und damit des Sockets, zurück. Du könntest aber auch ein globales Event statt einem pro Socket verwenden. Wenn das Event signalisiert wird, kannst du mit der Funktion Select herausfinden, in welche Sockets du schreiben kannst und bei welchen Daten anliegen. Oder du rufst zu jedem Socket WSAEnumNetworkEvents auf. Du würdest damit viele Events sparen, was in jedem Fall zu begrüßen ist. Threads kannst du dir eigentlich nur leisten, wenn du wenige Sockets hast. Threads benötigen eine ganze Menge Ressourcen. |
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Danke erstmal für die ganzen neuen Denkanstöße!
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ich wäre für jeden Fingerzeig dankbar! Gruß Mr_G |
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Hey, mich würde mal das Socket Tutorial interessieren :) Wollte nämlich mal eine eigene TClientSocket / TServerSocket Klasse basteln.
|
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Danke für die ausdauernde Hilfe!
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
WSAWaitForMultipleEvents gibt dir nicht das auslösende Event-Handle zurück, sondern den Index. Wenn du also zwei Listen hast, in der einen die Events, in der anderen die Sockets, kannst du die erste an WSAWaitForMultipleEvents übergeben, welches dir den Index des signalisierten Events zurückgibt. Diesen Index kannst du nun verwenden, um mit der zweiten Liste den Socket anzusprechen.
Bezüglich WSAEnumNetworkEvents hast du grundsätzlich Recht, aber Select sagt dir nichts zu FD_CLOSE, FD_ACCEPT und einigen anderen Ereignissen. |
Re: Sockets verwalten (WSAAsyncSelect vs WSAEventSelect)
Zitat:
Zitat:
So wie ich das nun sehe haben sich da zwei Ansätze rauskistallisiert (Danke dafür erstmal!). Ist eine der Lösungen der anderen aus bestimmten Gründen vorzuziehen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz