Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Netzwerkübertragung klappt nicht (https://www.delphipraxis.net/144914-netzwerkuebertragung-klappt-nicht.html)

Socke_SG 19. Dez 2009 18:17


Netzwerkübertragung klappt nicht
 
Hallo zusammen. Ich habe folgendes Problem. Und zwar möchte ich von einem Server Befehlsketten an einen Client schicken. Der soll die dann verarbeiten. Das ganz läuft über CLient/Server-Socket und klappt unter XP wunderbar. Auf meinem Vista-Rechner kommt es aber zu folgenden Problemen.

Die Befehle, die vom Serverk ommen sehen z.B. so aus:

#$$#AT100121042

Das erkennt der Client und reagiert entsprechend. Letztwendlich sind das Einträge aus nem Array, ist hier aber irrelevant. Insgesamt sollen 40 Einträge hintereinander gesendet werden. Klappt auch, aber nur bis maximal zum 16. Eintrag. Die restlichen kommen nicht mehr an. Das ganz wird in einem Timer immer wieder gesendet und immer wiederk ommen nur die ersten 16 Einträge an. Ich dachte zunächst, dass es an der Art des Eintrags oder signals liegen würde, ist aber nicht so. Er kann irgendwie nur 16 Einträge schicken.

Weiß einer woran das liegen könnte? Wie gesagt, das Problem tritt nur bei Vista auf. Auf Windows 7 habe ich es noch nicht getestet, aber ich vermute dort wird es auch so sein.

Vielen Danke im Voraus für eure Antworten

thkerkmann 19. Dez 2009 18:30

Re: Netzwerkübertragung klappt nicht
 
Hi,

ich denke nicht, dass es am Betriebssystem liegt, eher an der Art wie Du die Daten einliest.
Zeig doch mal etwas Code..

Gruss

Astat 19. Dez 2009 18:33

Re: Netzwerkübertragung klappt nicht
 
Hallo Socke_SG;

Zitat:

Zitat von Socke_SG
Weiß einer woran das liegen könnte?

Ohne zusätzliche Informationen eher nicht!

Was verwendest du für Sockets (Asynchrone, Synchrone WindowsSocket)?
Verwendest du "Black Box" Komponenten, wenn Ja welche? oder Socket API (Windows, Berkeley) ?
Wie sieht Deine Implementation von Send und Recv aus?

lg. Astat

Socke_SG 19. Dez 2009 18:38

Re: Netzwerkübertragung klappt nicht
 
Ich denke das schon, da es ja unter XP einwandfrei funktioniert.

Das vom Server kommende Signal wird folgendermaßen gesendet:

Delphi-Quellcode:
for j:=1 to 9 do begin
 with ServerSocket.Socket do begin
      dummy:=obj[ship1,j];
      if dummy<>'' then begin
  //    memo1.lines.add(dummy);
      Nachricht.text:='#$$#AO'+IntToStr(ship1)+'0'+IntToStr(j)+dummy;
      memo1.lines.add(Nachricht.Text);
    for k := 0 to ActiveConnections-1 do
      Connections[k].SendBuf (Nachricht, SizeOf(Nachricht));
      end;
end;
end;

for j:=10 to 40 do begin
 with ServerSocket.Socket do begin
      dummy:=obj[ship1,j];
      if dummy<>'' then begin
//      memo1.lines.add(dummy);
      Nachricht.text:='#$$#AO'+IntToStr(ship1)+IntToStr(j)+dummy;
      memo1.lines.add(Nachricht.Text);
    for k := 0 to ActiveConnections-1 do
      Connections[k].SendBuf (Nachricht, SizeOf(Nachricht));
      end;
end;
end;
Sind zwei Schleifen, da eine Signalzahl zur Identifizierung herangezogen wird. Ist aber nebensache hier

----------


Ich verwende die Sockets die bei Delphi gegeben sind. Ob sie nun synchron oder asynchron sind weiß ich leider nicht. Sind halt nur ClientSocket und ServerSocket-Komponenten.
Blackbox-Komponenten? Nein. Der Server nimmt einfach Einträge aus einem Array, packt die in einen String und sendet die. Code siehe oben.

Hoffe das sind hilfreiche Informationen

Astat 19. Dez 2009 18:49

Re: Netzwerkübertragung klappt nicht
 
Ok, Nachricht, SizeOf(Nachricht)

Wie ist Nachricht definiert.

Zeig auch die Empfangsroutiene, die ist auch wichtig.

lg. Astat

Socke_SG 19. Dez 2009 18:51

Re: Netzwerkübertragung klappt nicht
 
Nachricht ist einfach ne Chat-Nachricht:

Delphi-Quellcode:
var i,j,k: integer;
dummy: string;
Nachricht: TChatNachricht;
Die Empfangsroutine ist:

Delphi-Quellcode:
procedure TFrmClient.ClientSocketRead (Sender: TObject; Socket: TCustomWinSocket);
var Nachricht: TChatNachricht;
  strIn, strText: String;
  rand: integer;
begin
   Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
   mess:=Nachricht.text;
 if mess[1]+mess[2]+mess[3]+mess[4]='#$$#' then begin
     if mess[5]+mess[6] ='AO' then begin
      command:=mess;
      Commandinterpret (FrmClient, ClientSocket.Socket);
      end;

...

   if command[1]+command[2]+command[3]+command[4]+command[5]+command[6]='#$$#AO' then begin
      command[1]:=' ';
      command[2]:=' ';
      command[3]:=' ';
      command[4]:=' ';
      command[5]:=' ';
      command[6]:=' ';
      idpointer:=StrToInt(command[7]+command[8]+command[9]);
      filename:=command[7]+command[8]+command[9];
      loc:=StrToInt(command[10]+command[11]);
      command[7]:=' ';
      command[8]:=' ';
      command[9]:=' ';
      command[10]:=' ';
      command[11]:=' ';
      command:=trim(command);
      objectarray[idpointer,loc]:=command;
      end;
Wie gesagt unter XP alles kein Problem.

wicht 19. Dez 2009 18:57

Re: Netzwerkübertragung klappt nicht
 
Delphi-Quellcode:
   Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
   mess:=Nachricht.text;
if mess[1]+mess[2]+mess[3]+mess[4]='#$$#' then begin
     if mess[5]+mess[6] ='AO' then begin
Ist "Nachricht.text" vom Typ string?

Socke_SG 19. Dez 2009 18:58

Re: Netzwerkübertragung klappt nicht
 
Jepp

wicht 19. Dez 2009 19:00

Re: Netzwerkübertragung klappt nicht
 
Eventuell klappt alles, wenn du ShortString verwenden würdest. Da ein echter string eine variable Länge hat und in deinem Record nur ein Pointer sitzt, schickst du den Zeiger mit, was dich nicht weiterbringt.
Edit: Es sei noch gesagt, dass ShortString immer eine feste Länge hat. Das heißt, wenn du nur "abc" im string hast, ist der trotzdem 255 Bytes lang in deinem Record, und das ist nicht so schön wenn man das Teil über das Netzwerk verschickt.

Astat 19. Dez 2009 19:17

Re: Netzwerkübertragung klappt nicht
 
Hallo Socke_SG;

Zitat:

Zitat von Socke_SG
Nachricht ist einfach ne Chat-Nachricht:
Delphi-Quellcode:
Nachricht: TChatNachricht;

TChatNachricht ist ein Object, Array, Record ...?

Ich nehme mal an, wegen SizeOf ist es eine packed Record struct, mit ShortStrings??

Zitat:

Zitat von Socke_SG
Die Empfangsroutine ist:

Delphi-Quellcode:
procedure TFrmClient.ClientSocketRead (Sender: TObject; Socket: TCustomWinSocket);
var Nachricht: TChatNachricht;
  strIn, strText: String;
  rand: integer;
begin
   Socket.ReceiveBuf (Nachricht, SizeOf(Nachricht));
   mess:=Nachricht.text;
   ...
end;
Du liest aus dem Socket einfach in eine Struktur die du auch beim Senden verwendest.
Dies funktioniert nur manchmal, wenn Du glück hast richtig.
Du brauchst einen Empfangsbuffer, aus dem du die gesendeten Fragmente, wenn eine RecordSize übertragen
wurde, dann in Nachricht kopierst, und dann erst diese weiterbearbeitest.

Zitat:

Zitat von Socke_SG
Wie gesagt unter XP alles kein Problem.

Einfach Glück!

Wie dies korrekt implementiert werden kann, findest Du hier.
http://www.delphipraxis.net/internal...195&highlight=

lg. Astat


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.
Seite 1 von 2  1 2      

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