AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TServerSocket - ClientRead kommt nur einmal
Thema durchsuchen
Ansicht
Themen-Optionen

TServerSocket - ClientRead kommt nur einmal

Ein Thema von easywk · begonnen am 6. Mai 2008 · letzter Beitrag vom 7. Mai 2008
Antwort Antwort
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#1

TServerSocket - ClientRead kommt nur einmal

  Alt 6. Mai 2008, 13:46
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:
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;
Server-Seite - OnClientWrite
Delphi-Quellcode:
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;
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 ...

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
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: TServerSocket - ClientRead kommt nur einmal

  Alt 6. Mai 2008, 14:36
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
  Mit Zitat antworten Zitat
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: TServerSocket - ClientRead kommt nur einmal

  Alt 6. Mai 2008, 14:58
Ich hatte vorher auch schon mal eine Variante, die so aussah:

Client:
Delphi-Quellcode:
procedure TFormMain.NetzwerkClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var Answer:TNetAnswer;
begin
  if Socket.ReceiveLength<sizeof(Answer) then
    Exit;
  Socket.ReceiveBuf(Answer,sizeof(Answer));
  ...
Server:
Delphi-Quellcode:
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;
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).
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Benutzerbild von Net7
Net7

Registriert seit: 22. Jun 2004
Ort: Lauenburg
161 Beiträge
 
Delphi 7 Professional
 
#4

Re: TServerSocket - ClientRead kommt nur einmal

  Alt 6. Mai 2008, 17:01
Hi,

Zitat:
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
Hatte mal für mein Forum, eben deswegen eine einleuchtende Demo gebastelt, die kaum einer näheren Erläuterung bedürfte.

Klick!

Mfg Net7
Marko
So`ne Atombombe kann einem den ganzen Tag verderben!
Eine eigene DLL in C++ geschrieben wird meist ein Sklave für mein Delphi/Pascal.
  Mit Zitat antworten Zitat
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: TServerSocket - ClientRead kommt nur einmal

  Alt 7. Mai 2008, 08:40
Danke für das Beispiel.

Habe den Fehler inzwischen gefunden.
Auf dem Server muss ich natürlich das Ereignis OnClientRead verwenden und nicht OnClientWrite
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz