![]() |
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 |
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 |
Re: Netzwerkübertragung klappt nicht
Hallo Socke_SG;
Zitat:
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 |
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:
Sind zwei Schleifen, da eine Signalzahl zur Identifizierung herangezogen wird. Ist aber nebensache hier
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; ---------- 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 |
Re: Netzwerkübertragung klappt nicht
Ok, Nachricht, SizeOf(Nachricht)
Wie ist Nachricht definiert. Zeig auch die Empfangsroutiene, die ist auch wichtig. lg. Astat |
Re: Netzwerkübertragung klappt nicht
Nachricht ist einfach ne Chat-Nachricht:
Delphi-Quellcode:
Die Empfangsroutine ist:
var i,j,k: integer;
dummy: string; Nachricht: TChatNachricht;
Delphi-Quellcode:
Wie gesagt unter XP alles kein Problem.
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; |
Re: Netzwerkübertragung klappt nicht
Delphi-Quellcode:
Ist "Nachricht.text" vom Typ string?
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 |
Re: Netzwerkübertragung klappt nicht
Jepp
|
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. |
Re: Netzwerkübertragung klappt nicht
Hallo Socke_SG;
Zitat:
Ich nehme mal an, wegen SizeOf ist es eine packed Record struct, mit ShortStrings?? Zitat:
Delphi-Quellcode:
Du liest aus dem Socket einfach in eine Struktur die du auch beim Senden verwendest.
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; 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:
Wie dies korrekt implementiert werden kann, findest Du hier. ![]() lg. Astat |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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