Entwickler-Ecke
Internet / Netzwerk - problem TSocketServer Stream
nitschchedu - Mi 06.09.06 10:48
Titel: problem TSocketServer Stream
Ich möchte das sich ein Client Verbindet seine Daten sickt ich sie
speichere dann aber noch sie weiter Sicke zum Server.
Wenn der Server dann antwortet möchte ich das wieder Speichern und das dann wieder an den Client weiter geben.
Und soweiter hin und her.
Doch beim 3 Mal schmiert das ganze ab wenn ich den Stream weiter sicken will.
Vieleicht hat jemand eine Idee oder eine Bessere Lösung.
hier mal Der Code:
Delphi-Quelltext
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: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229:
| ...
procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); private mem: TMemoryStream; men: TMemoryStream;
clientMessage1: TMemoryStream; clientMessage2: TMemoryStream; ServerMessage1: TMemoryStream;
zahler: Integer; function CompareStreams(const A, B: TStream): Boolean; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btStartServerClick(Sender: TObject); begin ServerSocket1.Active := True; memconsole.Lines.Add('Gestartet'); end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin memconsole.Lines.Add('Verbunden!'); end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin memconsole.Lines.Add('Getrennt!'); end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var iLen: Integer; Bfr: Pointer; begin iLen := Socket.ReceiveLength; zahler := zahler + 1;
memconsole.Lines.Add('Sende Messege !');
GetMem(Bfr, iLen); try Socket.ReceiveBuf(Bfr^,iLen); mem.Write(Bfr^, iLen); finally FreeMem(Bfr); end;
if CompareStreams(mem, clientMessage1) then begin memconsole.Lines.Add('Message 1 vom Client ist gleich!'); ClientSocket1.Host := Edit1.Text; ClientSocket1.Active := True; end else if CompareStreams(mem, clientMessage2) then begin memconsole.Lines.Add('Message 2 vom Client ist gleich!'); end else begin memconsole.Lines.Add('Unbekannte Message vom Client'); mem.SaveToFile(ExtractFilePath(ParamStr(0))+ 'vomClient' + IntToStr(zahler) + '.dat'); end;
if ClientSocket1.Active then begin
GetMem(Bfr, iLen); try mem.Read(Bfr^, iLen); ClientSocket1.Socket.SendBuf(Bfr^,iLen); finally FreeMem(Bfr); end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); begin mem := TMemoryStream.Create; men := TMemoryStream.Create;
clientMessage1 := TMemoryStream.Create; clientMessage1.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'client1.dat');
clientMessage2 := TMemoryStream.Create; clientMessage2.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'vomClient3.dat');
ServerMessage1 := TMemoryStream.Create; ServerMessage1.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'vomServer2.dat');
zahler := 0; end;
function TForm1.CompareStreams(const A, B: TStream): Boolean; const BUFSIZE = 8192; var bufA, bufB: String; r: Integer; begin if A.Size <> B.Size then begin Result := False; end else begin A.Position := 0; B.Position := 0;
SetLength(bufA, BUFSIZE); SetLength(bufB, BUFSIZE);
while A.Position < A.Size do begin r := A.Size - A.Position;
if (r>BUFSIZE) or (r<=0) then begin r := BUFSIZE; end;
A.ReadBuffer(bufA[1], r); B.ReadBuffer(bufB[1], r);
if not CompareMem(PChar(bufA), PChar(bufB), r) then begin Result := False; Exit; end; end; Result := True; end; end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin memconsole.Lines.Add('Verbunden!'); end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var iLen: Integer; Bfr: Pointer; begin iLen := Socket.ReceiveLength;
zahler := zahler + 1;
memconsole.Lines.Add('Bekomme Messege !');
GetMem(Bfr, iLen); try Socket.ReceiveBuf(Bfr^,iLen); men.Write(Bfr^, iLen); finally FreeMem(Bfr); end;
if CompareStreams(men, ServerMessage1) then begin memconsole.Lines.Add('Message 1 vom Server ist gleich!'); end else begin memconsole.Lines.Add('Unbekannte Message vom Server'); men.SaveToFile(ExtractFilePath(ParamStr(0)) + 'vomServer' + IntToStr(zahler) + '.dat'); end;
if ServerSocket1.Active then begin
GetMem(Bfr, iLen); try men.Read(Bfr^, iLen);
ServerSocket1.Socket.Connections[0].SendBuf(Bfr^,iLen); finally FreeMem(Bfr); end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Host := Edit1.Text; ClientSocket1.Active := True; end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin memconsole.Lines.Add('Bekackter Server hat die Verbindung getrennt!'); end;
procedure TForm1.Button2Click(Sender: TObject); begin ClientSocket1.Close; end; |
Narses - Mi 06.09.06 10:54
Moin!
Verwende bitte die Delphi-Tags, um das Syntax-Highlighting für den Code zu nutzen; das kann man sonst praktisch nicht lesen... Einfach den Code markieren und auf das Plus neben "Bereiche - Delphi (+)" im Beitragseditor klicken. Alternativ [ delphi ] und [ /delphi ] um den Code setzen, aber die Leerzeichen in den Klammern weglassen. ;)
Ansonsten: Ziemlich viel Code, kannst du die Fehlerstelle nicht etwas eingrenzen? :?
cu
Narses
nitschchedu - Mi 06.09.06 13:21
Den Delphi Tag hatte ich schon gesucht aber nicht gefunden .
Also das Problem ist in Zeile 87 das kommt dann der Fehler beim 3 oder 2 mal.
Delphi-Quelltext
1:
| ClientSocket1.Socket.SendBuf(Bfr^,iLen); |
Das soll so eine Art zwischen Server Sein der in Datein Protokoliert was gesendet worden ist. Also er soll
was drüber geht in datein Speichern. So das ich Später die Datei nehmen kann, Lade und dann das sende.
Narses - Mi 06.09.06 13:29
Moin!
Schätze, das Problem liegt hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| if CompareStreams(mem, clientMessage1) then begin memconsole.Lines.Add('Message 1 vom Client ist gleich!'); ClientSocket1.Host := Edit1.Text; ClientSocket1.Active := True; end else if CompareStreams(mem, clientMessage2) then begin memconsole.Lines.Add('Message 2 vom Client ist gleich!'); end else begin memconsole.Lines.Add('Unbekannte Message vom Client'); mem.SaveToFile(ExtractFilePath(ParamStr(0))+ 'vomClient' + IntToStr(zahler) + '.dat'); end;
if ClientSocket1.Active then begin |
Das
ClientSocket1.Active := TRUE; ist
nicht synchron! Soll heißen: du bist erst verbunden, wenn das OnConnect-Ereignis des Clientsockets eintritt. Du greifst aber direkt auf den Socket zu, und das knallt dann, wenn der noch nicht verbunden ist (was ein Timing-Spielchen ist; mal geht´s vielleicht, aber eher nicht).
cu
Narses
nitschchedu - Mi 06.09.06 14:36
Was du meinst daran kann es nicht liegen weil
Client->[Mein zwichen Server] -> Speichert in Datei -> Connectet zum Server -> Sendet das was ich gespeichert habe.
Server -> Anwortet -> Speicher in Datei -> Sende Client was ich gespeichert habe.
Client Anwortet -> Speicher in Datei -> sicke zum Server !!! Und :cry: hier komm nun der Fehler.
Wie du siehst war er schon verbunden !
Das habe ich schon alles Debugt.
Vieleicht fählt dir ja noch was ein.
:cry:
Ach ja noch ein Info : Hatte vorher zwei Button mit den ich Verbunden habe (OnConnect) Server und Client bis ich
die Message in Memo Felde hatte dann habe ich wie hier oben beschrieben laufen lassen, und dann kamm eben der Fehler.
Narses - Mi 06.09.06 16:10
Moin!
Ich muss zugeben, ich habe Probleme, deinen Code zu lesen :? Warum machst du so ein Gehampel mit den Streams? :gruebel: Wenn du einfach nur die Daten lesen/schreiben/vergleichen willst, wären Strings doch sehr viel einfacher... :nixweiss:
nitschchedu hat folgendes geschrieben: |
Was du meinst daran kann es nicht liegen weil Client->[Mein zwichen Server] -> Speichert in Datei -> Connectet zum Server -> Sendet das was ich gespeichert habe.
Server -> Anwortet -> Speicher in Datei -> Sende Client was ich gespeichert habe.
Client Anwortet -> Speicher in Datei -> sicke zum Server !!! Und :cry: hier komm nun der Fehler. |
Ich kann nicht hellsehen, ich kann nur sehen, was in deinem Code steht. :D Und wenn der Fall, den ich angesprochen habe, eintritt, dann knallt das, ganz sicher. Ob er eintritt, kann ich nicht sagen; aber wenn, dann genau an der von dir beobachteten Stelle.
So, unabhängig davon, ob das deiner Meinung nach "sein kann" oder nicht, solltest du in betracht ziehen, dass die Realität sich nicht zwingend an deiner Meinung orientiert. ;)
cu
Narses
nitschchedu - Mi 06.09.06 16:33
:D ok ich werde es ab bessern aber ich nehme mit absicht keine Strings da auch daten durch gehen die sonder zeichen haben oder Files die kann ich doch nicht in string unter bringen, da kann ich sie nicht bearbeiten.
Übrigens hast du den schon mal mit den Klassen (Tsocket) richtig gearbeitet ?
:?:
oder mit Stream :?:
ich habe so das gefühl das du damit nicht gut anzusprechen bist :wink:
also werde mal den Code Abbessern :!: :wink:
und Dann Poste ich das nochmal hier
Narses - Mi 06.09.06 17:12
Moin!
nitschchedu hat folgendes geschrieben: |
Übrigens hast du den schon mal mit den Klassen (Tsocket) richtig gearbeitet ?
[...]
ich habe so das gefühl das du damit nicht gut anzusprechen bist |
Och, joaah, ich hab schonmal einen Chat mit den Sockets geschrieben. 8) Im Moment versuche ich den Chat noch um einen Dateitransfer und einen Mal-Chat zu erweitern... ;)
nitschchedu hat folgendes geschrieben: |
| aber ich nehme mit absicht keine Strings da auch daten durch gehen die sonder zeichen haben oder Files die kann ich doch nicht in string unter bringen, da kann ich sie nicht bearbeiten. |
Geht aber, habe ich bereits erfolgreich gemacht. ;)
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!