![]() |
gleichzeitiger Zugriff über Sockets
Hallo allerseits,
ich hab mal eine allgemeine Frage, auf die ich bisher noch keine zufriedenstellende Antwort bekommen habe. Wenn ich einen Server programmiere, der über die Socket-Komponente Verbindungen annimmt, dann können ja grundsätzlich mal viele Clients gleichzeitig eine Verbindung herstellen. Was passiert nun, wenn zwei Clients genau gleichzeitig auf den Server zugreifen, also den gleichen Socket nutzen möchten? Meine Vermutung ist, dass dieser Fall kein Problem darstellt, weil jedesmal eine neue Instanz erzeugt wird, ist das richtig? :wiejetzt: |
Oder kann mir jemand sagen, wo ich solche Sachen nachlesen kann? Es ist ja doch wichtig, sowas zu berücksichtigen!
|
Moin Evilboyz,
probiert habe ich's nicht, aber logisch wäre es, wenn in so einem Falle einer oder beide Clients einen Fehler zurückgemeldet bekommen (TClientSocket.OnError), dass die Verbindung fehlgeschlagen ist, und dann entsprechend erneut einen Verbindungsaufbau versuchen können/müssen. |
Re: gleichzeitiger Zugriff über Sockets
Ich denke, es hat bisher noch keiner Deine Frage gut beantworten können, da es wohl, sofern ich das Prinzip der Datenübertragung im Netzwerk richtig verstehe, nicht vorkommen kann, das 2 Datenpakete gleichzeitig eintreffen.
Denn du hast, wie ich annehme, nur eine Leitung, auf der die Daten herein kommen, und in dieser einen Leitung können natürlich nicht 2 Datenpakete nebeneinander übertragen werden, sondern immer nur hinter einander. Und selbst bei grossen Datenmengen werden ja nur viele kleine Datenpakete übertragen, und von deinem Rechner wieder zu großen Objekten zusammen gebaut. Aber selbst wenn du 2 Leitungen hast, und irgendwie 2 Datenpakete ankommen, und diese auch noch von 2 Prozessoren gleichzeitig verarbeitet würden, selbst dann würde vor dem Listener nur ein Stack liegen, auf den diese Datenpackete gelegt werden, und da würde dann der Zufall entscheiden welches Paket zuerst ankommt. Du siehst, wie man es auch wendet, die Datenpakete kommen nie gleichzeitig an, und du brauchst dir also um diesen einen Fall auch keine Sorgen zu machen *lächelt* |
Re: gleichzeitiger Zugriff über Sockets
Natürlich können viele Clienten zur gleichen Zeit auf den gleichen Server Port kommunizieren. Das Berkeley Socket API multiplext diese vielen Client Packete und Indy erzeugt für jeden verbundenen Client ja einen eigenen Thread zur Verfügung. Alles andere wäre ja auch Schwachsinnig, da ein Server sehr viele Clienten zur "gleichen" Zeit bedienen muß. Allerdings über die Internet-Verbindung kann zur gleichen Zeit immer nur EIN TCP/IP Packet von EINEM Clienten empfangen werden. Dies ist fakt. Das spielt aber keine Rolle das die Dest IP + Port + Source IP + Session ID des Packetes exakt angibt wohin es weitergeleitet werden soll.
Gruß Hagen |
Re: gleichzeitiger Zugriff über Sockets
Also ich denke mal auch, es gibt ja nur einen Socket-Hauptthread, der auch wenn 2 Pakete gleichzeitig ankommen sollten (wie auch immer), die Unterthreads ja nur nacheinander erzeugen kann, also absolute Gleichzeitigkeit ist unmöglich.
|
Re: gleichzeitiger Zugriff über Sockets
Die Client-Threads werden erzeugt wenn ein neuer Client versucht auf einem Port zu verbinden. Sie laufen solange bis die Client Verbindung getrennt wird. In der Lebenszeit eines Client Threads wartet er nun auf TCP/IP Packete die an ihn addressiert sind. Das heist aber auch das andere Clienten und deren Serverseitigen Threads in parallel warten, auf dem gleichen Serve Port, aber NICHT auf dem gleichen Socket ansich.
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 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