Autor Beitrag
Chrizzzz
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 05.09.05 02:16 
Hi Leute, ich hab da ein kleines Problem:

Ich versuche, über Winsock alle ankommenden Daten zu "Buffern" bis ein bestimmtes Zeichen gesendet wird.

Beispiel ankommender String:

Befehl1|Argument1|Argument2|....|Argument10 CHAR(10) (anzahl der Argumente variiert)

CHAR(10) schliesst eine Befehlssequenz ab.

Der ankommende String soll solange gebuffert werden, bis ein Befehl samt Argumenten mit CHAR(10) abgeschlossen wird. Dann soll der Befehl aus dem Buffer entfernt werden und an eine funktion NeuerBefehl (data:string); übergeben werden.

Bei meinem Code friert das Programm ein, sobald Daten ankommen.

Codeausschnitt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.tcpRead(Sender: TObject; Socket: TCustomWinSocket);
var
  t, wort:string;
  temp, position:integer;
begin
  t:=tcp.Socket.ReceiveText();
    ReceiveBuffer := ReceiveBuffer + t;
    position := pos(#10, ReceiveBuffer);
     
    while ( position <> 0 ) do begin
      temp := pos(ReceiveBuffer, Chr(10))+1;
      If temp > 1 Then begin
        NeuerBefehl (leftstr(ReceiveBuffer, temp+1));
      end;
    
    ReceiveBuffer := MidStr(ReceiveBuffer, 1, temp);
end;


Selbiges prinzip unter VisualBasic funktioniert. Hier der Codeausschnitt aus dem VisualBasic Programm:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
     
Dim t As String
Dim temp As Long
  Winsock1.GetData t
  ReceiveBuffer = ReceiveBuffer + t
           
     Do While InStr(1, ReceiveBuffer, Chr(10)) > 0
     
     temp = InStr(1, ReceiveBuffer, Chr(10))
       If temp > 1 Then
        NeuerBefehl Left(ReceiveBuffer, temp - 1)
       Else
         NeuerBefehl ""
       End If
      ReceiveBuffer = Mid(ReceiveBuffer, temp + 2)
      Loop
    End Sub

Kann mir wer helfen? Danke schonmal im Vorraus.

GreeZzZz
ChriZzZz
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 05.09.05 09:34 
Moin und :welcome: im Forum!

Probier das doch mal so (wobei ich unterstelle, dass du TClientSocket verwendet hast):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  NetworkBuffer: String;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  var
    i: Integer;
    SL: TStringList;
begin
  NetworkBuffer := NetworkBuffer +Socket.ReceiveText;
  SL := TStringList.Create;
  SL.Text := NetworkBuffer;
  for i := 0 to SL.Count-2 do
    NeuerBefehl(SL.Strings[i]);
  if (SL.Count > 0then
    NetworkBuffer := SL.Strings[SL.Count-1]
  else
    NetworkBuffer := '';
  SL.Free;
end;

cu
Narses
Chrizzzz Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 05.09.05 17:48 
Joah öhm "moin" oder eher nabönd *g* Merci für die Begrüßung ;)

Vielen dank für deinen Tip, funktioniert supi.

GreeZzZz
ChriZzZz