Hallo Leute,
ich habe ein Problem mit den Indy 10 TCP Komponenten. Ich musste vor ein paar Tagen meinen PC formatieren und neumachen und seitdem funktionieren einige meiner Programme nicht mehr. Die alten Binaries funktionieren (compiliert vor der Formatierung); Neue Compilate jedoch nicht. Der Quellcode wurde nicht geändert.
Bei dem Tool handelt es sich um einen TCP-Redirector. Ein Netzwerk-Debug-Tool das einen Socket öffnet, an dem sich dann ein Client anmeldet und die Daten an eine andere IP weiterleitet. Die einzelnen Datenpakete haben jeweils die richtige Größe, jedoch sind die Daten aber dem 5 oder 6 Byte falsch. Ich habe zur Kontrolle einen TCP/IP Sniffer mitlaufen lassen. Dieser empfängt die korrekten Daten (strange?).
Die Idee stammt dabei aus diesem Tutorial.
How to write a TCP Redirector using Indy
ToClient = Socket der mit dem Clienten verbunden ist
ToServer = Socket der mit dem Server verbunden ist
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| procedure Tmain.ToClientExecute(AContext: TIdContext); Var Data : String; begin Try Try ToServer.Host := 'xxx.xxx.xxx.xxx'; ToServer.Port := xxxxx; ToServer.Connect;
AContext.Connection.Socket.ReadTimeout := 1000;
ToClientt := AContext;
repeat if not AContext.Connection.Socket.InputBufferIsEmpty then begin data := AContext.Connection.Socket.InputBufferAsString;; OnSend(ToServer, Data); End;
if not ToServer.Socket.InputBufferIsEmpty then begin Data := ToServer.Socket.InputBufferAsString; OnRecv(AContext, Data); end;
SleepEx(1, True); until (not AContext.Connection.Connected) or (not ToServer.Connected); Finally
if not AContext.Connection.Connected then begin Addlog('ToClient Disconnected'); end;
if not ToServer.Connected then begin Addlog('ToServer Disconnected'); end;
if Assigned(ToServer) then Begin ToServer.Disconnect; ToServer.Free; End;
AContext.Connection.Disconnect; end; Except
End; end; |
Das Problem konnte zeilweise (1,2 Pakete) mit dem zusätzlichen Clear des Buffers behoben werden. Ich vermute es kann vielleicht mit dem Threading und der Synchonisation zusammen hängen.
Ich bin für jede Hilfe dankbar, meist sieht man den Wald vor lauter Bäumen nicht.
Mit freundlichen Grüßen
Tobi