Autor Beitrag
nitschchedu
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 06.09.06 10:48 
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:

ausblenden volle Höhe 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
    { Private-Deklarationen }
    mem: TMemoryStream;
    men: TMemoryStream;

    clientMessage1: TMemoryStream;
    clientMessage2: TMemoryStream;
    ServerMessage1: TMemoryStream;

    zahler: Integer;
    function CompareStreams(const A, B: TStream): Boolean;
  public
    { Public-Deklarationen }
  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<=0then
      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;

  {
  if ServerSocket1.Socket.Connections[0].SendStream(mem) then
  begin
    memconsole.Lines.Add('Stream Versendet');
  end else
  begin
    memconsole.Lines.Add('Stream nicht Versendet');
  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;


Zuletzt bearbeitet von nitschchedu am Mi 06.09.06 13:15, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
nitschchedu Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 06.09.06 13:29 
Moin!

Schätze, das Problem liegt hier:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
nitschchedu Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:

user profile iconnitschchedu 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
nitschchedu Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 06.09.06 17:12 
Moin!

user profile iconnitschchedu 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... ;)

user profile iconnitschchedu 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

_________________
There are 10 types of people - those who understand binary and those who don´t.