Nebenbei: Wie ensaron auch noch einmal erwähnt: Mehrere Threads sind bei asynchroner Abarbeitung unnötig. ensaron zeigt wie du das alles schön verpackt einbauen kannst.
Wenn du vorher etwas üben willst, empfehle ich dir, dich erst einmal auf eine Maschine zu konzentrieren. Knall eine TWSocket Komponente (WSocket1) auf ein Fenster und definiere via Obejektinspektor was in den Fällen
OnDataAvailable, OnChangeState, und evt. später OnError, OnSocksError, OnSessionClosed geschehen soll.
Sobald alles läuft....
Das tut es.
Mehrere Maschinen. Wie du schreibst, nimmst du für jede Verbindung/Maschine einen Socket. Diese Sockets erzeugst du bei Bedarf zur Laufzeit (auf deinem Form befindet sich also immer noch nur eine TWSocket Komponente WSocket1). Ereignisse wie OnDataAvailable, OnChangeState musst für jeden dieser Sockets verarbeiten. Dies hast du aber mit WSocket1 bereits erledigt. Du biegst einfach OnDataAvailable, OnChangeState um:
MeinZurLaufZeitErzeugterSocket.OnDataAvailable := WSocket1DataAvailable;
MeinZurLaufZeitErzeugterSocket.OnChangeState := WSocket1ChangeState;
Damit du unterscheiden kannst, welcher deiner Sockets (Maschinen) ein Ereignis (wie zum Beispiel OnDataAvailable) ausgelöst hat, kannst du wie ensaron zeigt die IPAdresse (und allenfalls den Port) der Zieladresse (Maschine) nutzen. Oder du verwendest die Eigenschaft Tag von TWSocket:
MeinZurLaufZeitErzeugterSocket.Tag := irgendEineEindeutigeNummer;
In WSocket1DataAvailable(Sender: TObject; Error: Word); kannst du dann via
welcherSocketSendetDaten := ( Sender as TWSocket ).tag;
ermitteln, über welche Verbindung Daten ankommen.
Danke für eure Geduld mit mir, ich werde mich nächste Woche damit beschäftigen.
Hab heut noch ein paar andere Dinge zu tun.