Entwickler-Ecke

Internet / Netzwerk - Delphi: Winsocket Befehls-Buffer


Chrizzzz - Mo 05.09.05 02:16
Titel: Delphi: Winsocket Befehls-Buffer
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

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:

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 - Mo 05.09.05 09:34

Moin und :welcome: im Forum!

Probier das doch mal so (wobei ich unterstelle, dass du TClientSocket verwendet hast):

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 - 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