Indy benutzt blockierende Sockets.
Ich habe festgestellt, dass in einem Programm mit vielen Verbindungen (zur exakt gleichen Zeit) dies zwangsläufig zu Problemen führt. Entweder musst du dies komplett Kontrolliert ausführen (mit maximal einer Verbindung zur gleichen Zeit) oder du benutzt ICS, welche nicht blockierend arbeitet.
Diese Erfahrung habe ich jedenfalls gemacht :/
Konkurrierender Zugriff auf einen Socket kann nur in einer Multithreading Anwendung gut gehen.
Es liegt nicht am blockierenden Zugriff, falls
Indy bei vielen Verbindungen "Probleme" macht, sondern meist an Fehlern im Code, vor allem bei der Kommunikation mit dem Hauptthread der
VCL geschieht das gern.
Auch das Betriebssystem spielt eine Rolle, zum Beispiel wenn die Socket-Verbindungen nicht wiederverwendet werden, sondern der Client immer wieder neue Sockets öffnet und schliesst. Die geschlossenen Sockets bleiben dann für einige Zeit in Warteposition (Status TIME_WAIT), und das System wird sehr schnell überlastet. Das kann man mit netstat oder TCPView leicht nachvollziehen.
Jede
Indy Client Komponente baut ihre eigene
TCP Verbindung über einen eigenen Socket auf. Bei einem
Indy Server gibt es für jede Verbindung einen separaten Thread, und jeder Socket wird immer nur von einem Thread bedient.