AW: Socket C&S
Zitat:
Ergebnis meiner Tests: Es scheint ein Zeitproblem zu geben. Baue ich eine Pause nach jedem
Code:
ein kommt auch alles an.
if ServerSocket.Socket.ActiveConnections>0 then
ServerSocket.Socket.Connections[0].SendBuf(...); |
AW: Socket C&S
Zitat:
|
AW: Socket C&S
Zitat:
Und hängt es mal noch mehr, ... Besser du baust sicherheitshalber gleich ein Sleep(3600000); ein. |
AW: Socket C&S
Zitat:
|
AW: Socket C&S
TCP ist immer ein "Stream", das heißt die Daten können schlimmstenfalls byteweise ankommen. (Bytes kommen aber immer ganz oder gar nicht an, darauf kann man sich zum Glück verlassen ;-) )
Ich habe das damals so gelöst, dass ich einen struct/record mit den Nutzdaten verschickt habe (konstante Länge). Auf Empfangsseite habe ich einen passend dimensionierten Puffer vorgehalten. Immer, wenn was angekommen ist, habe ich die Daten (in einer Schleife, solange neue Daten da waren!) ein Byte nach links geschoben, ein Byte neue Daten hinten angehängt und geprüft ob das ein gültiges Paket ist. (Konstante prüfen plus Checksumme) Bei einem gültigen Paket wurde ein Callback ausgelöst. Du kannst auch immer einen Längenwert vor die Daten schreiben. Oder ein Trennzeichen (Zeilenumbruch) zwischen die Daten. Du brauchst irgendein Verfahren, um deine Daten in einen kontinuierlichen Stream zu schreiben und (kniffeliger) sie aus einem kontinuierlichen Stream wieder herauszufischen. Ich bin mir nicht sicher, was du mit "sauberer Übertragung" meinst. Um noch deine ursprüngliche Frage zu beantworten: Zitat:
|
AW: Socket C&S
Du kannst halt nie sicher sagen, wann welche Paketteile auf der anderen Seite ankommen.
Wenn Du etwa sendest: --- Dies ist Paket 1 --- Jetzt kommt Paket 2 --- kann auf der anderen Seite ankommen: --- Dies ist Paket 1 Jetzt kom --- mt Paket 2 --- oder alles in einem Block oder in 3 Blöcken. Du musst also die Eingangsdaten puffern und selbst ermitteln, ob ein vollständiges Paket vorliegt, welches Du verarbeiten kannst. Dabei können aber auch schon Daten für 2 und 1/4 weitere Pakete im Puffer vorliegen. Dabei ist auch noch zu beachten, dass Daten von unterschiedlichen Clients reinkommen können. Also brauchst Du den o.g. Puffer ggf. pro Client. |
AW: Socket C&S
Schön wäre wenn immer alles ankommen würde. Ich habe n * 1024 Bytes geschickt (gesamt ca. 200000 Bytes). Angekommen sind ca. 65000 Bytes. Immer! Nur mit Pause beim Senden hat es funktioniert.
|
AW: Socket C&S
Moin,
was benutzt du eigentlich genau für Komponenten und Einstellungen? Beispielsweise steht in der Hilfe zu TCustomWinSocket.SendBuf: Zitat:
|
AW: Socket C&S
Zitat:
|
AW: Socket C&S
Sooo...
Server:
Code:
Client:
procedure TForm1.Button1Click(Sender: TObject);
var bmp: TBitmap; buf: array of Byte; res, len, bufidx, bufsize: Integer; procedure BmpToBuf; var i, x, y, w, h: Integer; p: PByteArray; begin w:=bmp.Width; h:=bmp.Height; bmp.PixelFormat:=pf24bit; i:=1234; Move(i, buf[0], sizeof(Integer)); Move(w, buf[sizeof(Integer)], sizeof(Integer)); Move(h, buf[2*sizeof(Integer)], sizeof(Integer)); i:=sizeof(Integer)+2*sizeof(Integer); for y:=0 to h-1 do begin p:=bmp.Scanline[y]; Move(p[0], buf[i], w*3); inc(i, w*3); end; end; begin bmp:=<MacheinScreenshotvomFenster>(Handle); len:=sizeof(Integer)+2*sizeof(Integer)+bmp.Height*bmp.Width*3; if len mod 1024 <> 0 then inc(len, 1024-(len mod 1024)); SetLength(buf, len); BmpToBuf; bmp.Free; if ServerSocket.Socket.ActiveConnections>0 then begin bufidx:=0; bufsize:=Length(buf); while bufsize>0 do begin repeat res:=ServerSocket.Socket.Connections[0].SendBuf(buf[bufidx], Min(1024, bufsize)); if res<>1024 then <MacheinePause>(50); until res<>-1; inc(bufidx, Min(1024, bufsize)); dec(bufsize, Min(1024, bufsize)); end; end; Finalize(buf); end;
Code:
var
buf: array of Byte; sz: Integer = -1; id, wi, hi: Integer; procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); var bmp: TBitmap; len, res: Integer; procedure BufToBmp; var i, x, y, w, h: Integer; p: PByteArray; begin bmp:=TBitmap.Create; bmp.PixelFormat:=pf24Bit; Move(buf[0], i, sizeof(Integer)); Move(buf[sizeof(Integer)], w, sizeof(Integer)); Move(buf[2*sizeof(Integer)], h, sizeof(Integer)); bmp.Width:=w; bmp.Height:=h; i:=sizeof(Integer)+2*sizeof(Integer); for y:=0 to h-1 do begin if i+w*3-1>Length(buf) then Break; p:=bmp.Scanline[y]; Move(buf[i], p[0], w*3); inc(i, w*3); end; end; begin len:=Length(buf); SetLength(buf, len+1024); res:=Socket.ReceiveBuf(buf[len], 1024); if (sz=-1) and (Length(buf)>=sizeof(Integer)+2*sizeof(Integer)) then begin Move(buf[0], id, sizeof(Integer)); Move(buf[sizeof(Integer)], wi, sizeof(Integer)); Move(buf[2*sizeof(Integer)], hi, sizeof(Integer)); if id=1234 then begin sz:=sizeof(Integer)+2*sizeof(Integer)+hi*wi*3; if sz mod 1024 <> 0 then inc(sz, 1024-(sz mod 1024)); end; end; if (sz>-1) and (Length(buf)=sz) then begin BufToBmp; Image1.Picture.Bitmap.Assign(bmp); bmp.Free; Finalize(buf); sz:=-1; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 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