AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Netzwerkübertragung klappt nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Netzwerkübertragung klappt nicht

Ein Thema von Socke_SG · begonnen am 19. Dez 2009 · letzter Beitrag vom 19. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Socke_SG

Registriert seit: 31. Mär 2008
47 Beiträge
 
#1

Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:17
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
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:30
Hi,

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

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#3

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:33
Hallo Socke_SG;

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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Socke_SG

Registriert seit: 31. Mär 2008
47 Beiträge
 
#4

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:38
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
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#5

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:49
Ok, Nachricht, SizeOf(Nachricht)

Wie ist Nachricht definiert.

Zeig auch die Empfangsroutiene, die ist auch wichtig.

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Socke_SG

Registriert seit: 31. Mär 2008
47 Beiträge
 
#6

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:51
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] ='AOthen begin
      command:=mess;
      Commandinterpret (FrmClient, ClientSocket.Socket);
      end;

...

   if command[1]+command[2]+command[3]+command[4]+command[5]+command[6]='#$$#AOthen 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.
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:57
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] ='AOthen begin
Ist "Nachricht.text" vom Typ string?
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Socke_SG

Registriert seit: 31. Mär 2008
47 Beiträge
 
#8

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 18:58
Jepp
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#9

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 19:00
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.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#10

Re: Netzwerkübertragung klappt nicht

  Alt 19. Dez 2009, 19:17
Hallo Socke_SG;

Zitat von Socke_SG:
Nachricht ist einfach ne Chat-Nachricht:Nachricht: TChatNachricht;
TChatNachricht ist ein Object, Array, Record ...?

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

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 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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:32 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