![]() |
TServerSocket - ClientRead kommt nur einmal
Moin, moin,
ich möchte zwischen dem Server und dem Client Daten austauschen. Dazu benutze ich TServerSocket und TClientSocket: - Client sendet meine eigene Datenstruktur TNetRequest - Server liest diese aus und antwortet mit der Struktur TNetAnswer - wenn der Client dann die Antwort hat, schickt er die nächste Anfrage Client-Seite - On Read
Delphi-Quellcode:
Server-Seite - OnClientWrite
procedure TFormMain.NetzwerkClientRead(Sender: TObject;
Socket: TCustomWinSocket); var Answer:TNetAnswer; begin Socket.ReceiveBuf(Answer,sizeof(Answer)); // die eigentlichen Daten auswerten case Answer.RequestId of 0 : begin // TBD Antwort weiter verarbeiten Inc(Request.RequestId); // Request ist im Client global angelegt Socket.SendBuf(Request,sizeof(Request)); end; 1 : begin // TBD Antwort weiter verarbeiten Dec(Request.RequestId); // Request ist im Client global angelegt Socket.SendBuf(Request,sizeof(Request)); end; end;
Delphi-Quellcode:
Mein Problem: die erste Anfrage kommt beim Server an und wird auch beantwortet. Per Debug habe ich auch festgestellt, dass der Client die Antwort vom Server erhält - NUR kommt beim Server die zweite Anfrage nicht mehr an ...
procedure TFormMain.NetzwerkServerClientWrite(Sender: TObject;
Socket: TCustomWinSocket); var Request:TNetRequest; Answer:TNetAnswer; begin Socket.ReceiveBuf(Request,sizeof(Request)); ExecNetzwerkRequest(Request,Answer); // Antwort aufbereiten Socket.SendBuf(Answer,sizeof(Answer)); end; Hat da irgendjemand eine Idee zu? Die Suche hat mir auch nicht wirklich weitergeholfen (was auch daran liegen könnte, dass ich die komplizierteren Threads zu diesem Thema einfach nicht verstanden habe :-)) easywk |
Re: TServerSocket - ClientRead kommt nur einmal
Mal eine andere Frage: Woher willst du wissen, ob du im Empfangsbuffer des Socket schon die gesamte Strukturgrösse vorliegen hast? Du liest einfach diese Grösse aus, ohne vorher zu schauen, wieviel empfangen wurde. Somit kann es sein dass du gar nicht die komplette Struktur einliest.
-> Socket.ReceiveLength() -> Socket.Read Rückgabewert |
Re: TServerSocket - ClientRead kommt nur einmal
Ich hatte vorher auch schon mal eine Variante, die so aussah:
Client:
Delphi-Quellcode:
Server:
procedure TFormMain.NetzwerkClientRead(Sender: TObject;
Socket: TCustomWinSocket); var Answer:TNetAnswer; begin if Socket.ReceiveLength<sizeof(Answer) then Exit; Socket.ReceiveBuf(Answer,sizeof(Answer)); ...
Delphi-Quellcode:
Das hat aber auch nichts geändert. Außerdem habe ich beim Debuggen nachgeschaut und die ReceiveLength ist genau die erwartete Länge - es hat also nichts mit meinem Problem zu tun (wobei mir durchaus klar ist, dass das noch sauber gelöst werden muss).
procedure TFormMain.NetzwerkServerClientWrite(Sender: TObject;
Socket: TCustomWinSocket); var Request:TNetRequest; Answer:TNetAnswer; begin if Socket.ReceiveLength<sizeof(Request) then Exit; Socket.ReceiveBuf(Request,sizeof(Request)); ... end; |
Re: TServerSocket - ClientRead kommt nur einmal
Hi,
Zitat:
![]() Mfg Net7 |
Re: TServerSocket - ClientRead kommt nur einmal
Danke für das Beispiel.
Habe den Fehler inzwischen gefunden. Auf dem Server muss ich natürlich das Ereignis OnClientRead verwenden und nicht OnClientWrite :wall: :wall: :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz