Synapse TCP Block Socket - Verirrte Antwort

Alle Fragen zur Netzwerkkommunikation
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Synapse TCP Block Socket - Verirrte Antwort

Beitrag von Eclipticon »

Hi,

ich schicke aus meinem Programm (Client) ein TCP Datenpaket an einen Server und moechte ein Paket ans Antwort zurueckbekommen. Grundsaetzlich funktioniert das, wenn ich aber zwei Client-Prozesse starte, kommt die Antwort an irgendeinen der beiden zurueck. In Wireshark sehe ich auch, dass die Antwort an unterschiedliche lokale Ports geht, wenn ich ich das erste Paket aus unterschiedlichen Instanzen des Clients abschicke.

Ich frage mich daher, was ich bei folgendem (Pseudo-)Code falsch mache:

Code: Alles auswählen

 
uses Blcksock;
 
// ...
 
MeiTCPBlockSocket := TTCPBlockSocket.Create;
MeiTCPBlockSocket.Connect(RemoteHost, RemotePort);
MeiTCPBlockSocket.ResetLastError;
 
// ...
 
MeiTCPBlockSocket.SendBuffer(@XCom, SizeOf(XCom));
 
// ...
 
BufferSize := MeiTCPBlockSocket.WaitingData;
SetLength(Buffer, BufferSize);
MeiTCPBlockSocket.RecvBufferEx(@Buffer[0], BufferSize, 2500);
 
// ...
 
MeiTCPBlockSocket.CloseSocket;
FreeAndNil(MeiTCPBlockSocket);


Dankeschoen :)

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Synapse TCP Block Socket - Verirrte Antwort

Beitrag von Antrepolit »

Hier verstehe ich gleich mehrere DInge nicht.

1. Ist es doch so, dass man pro Client, also pro Instanz deines Programms, eine IP-Adresse und einen Port braucht. Ist ein Port bereits belegt, muss man einen anderen wählen.
2. Verwendet der Server ohnhin andere Ports als dein Client. Was am Client an Port 1211 herausgeht, hat am Server einen ganz anderen Port, den du ja frei (außer privilegierte) auswählen kannst.
3. Muss dein Server dann jedem Client einen anderen lokalen Port zuweisen, um die Verbindung aufrecht zu erhalten. Also kurz: Pro Client eine Instanz von TTCPBlockSocket plus nochmal eine, auf der dein Server bloß lauscht, ob sich denn ein CLient verbinden möchte.
4. Und da kann es nicht sein, dass "irgendein CLient" die ANtwort bekommt, wenn das richtig programmiert wurde.

Also nochmal kurz: Auf einem Socket lauschst du für Clients. Möchte einer was, bekommt er ein Port zugewiesen und verbindet sich darauf. Der Server startet für diesen Port eine Instanz von TTCPBlockSocket und am besten einen eigenen Thread dafür.

Oder wie machst du das?
Grüße, Antrepolit

care only if your os is really burning

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Synapse TCP Block Socket - Verirrte Antwort

Beitrag von Eclipticon »

Hi,

zur Entwirrung: Ich arbeite aussschliesslich am Client, der Server (closed source, commercial) existiert bereits.

Antrepolit hat geschrieben:2. Verwendet der Server ohnhin andere Ports als dein Client. Was am Client an Port 1211 herausgeht, hat am Server einen ganz anderen Port, den du ja frei (außer privilegierte) auswählen kannst.


Klar, der Server gibt einen bestimmten Port vor, den ich im Client in MeiTCPBlockSocket.Connect(RemoteHost, RemotePort) uebergebe.

Antrepolit hat geschrieben:3. Muss dein Server dann jedem Client einen anderen lokalen Port zuweisen, um die Verbindung aufrecht zu erhalten.


Das tut er offenbar auch, die Antworten vom Server gehen lt. Wireshark an unterschiedliche Ports, wenn ich mehr als einen Client verwende. Mein Client empfaengt sie aber alle. Wie bringe ich meinem Client bei, auf welchem lokalen Port die Antworten kommen?

Antrepolit hat geschrieben:4. Und da kann es nicht sein, dass "irgendein CLient" die ANtwort bekommt, wenn das richtig programmiert wurde.


Sehe ich genauso.

Danke!

Antworten