Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pipes: Eintreffende Nachrichten sind zu kurz (https://www.delphipraxis.net/154776-pipes-eintreffende-nachrichten-sind-zu-kurz.html)

Memnarch 24. Sep 2010 15:19

Pipes: Eintreffende Nachrichten sind zu kurz
 
Guten Tag,
Bin neu in diesem Forum und hoffe dass ich in der richtigen Sektion gelandet bin(bin noch etwas orientierungslos).

Habe zwar die Sufu benutzt, aber mein Spezieller Fall konnte nicht beantwortet werden.

Folgendes:

Ich sende 'GETTIME'.

Der Server meldet auch fröhlich dass er 7 Bytes empfangen hat...allerdings kann er davon nur 'GETT' darstellen. Ich habe dann rausgefunden dass ich in meinem fall folgendes machen muss:

[ClientSeite]

AnzahlDerZuSendendenBytes(hier 7) * 2 + 2 = 16

Die Formel muss ich auf alles was ich senden will anwenden.

Im obigen beispiel kommt dann auf dem Server auch eine Nachricht mit 16 BYtes an, nach dem auslesen der 16BYtes, kann ich einfach die überschüssigen hinten abschneiden, und habe meine NAchricht.

Also irgendwas läuft da doch verdammt schief, wenn ich erst meine Daten mehr als dublizieren muss o.O.

Mein System:
Win Xp 32Bit
Delphi2010 Architect (Bin Azubi und gerade auf der Firma, also nicht wundern ;), Pipes mach ich übrigens gerade aus freien Stücken). Das erste Beispiel(was hieraus nicht mehr zu erkennen ist) stammt aus meinem Delphi Buch, Bin gerade bei den letzten paar Seiten und da war dann halt auch ein Beispiel zun PIpes, schlecht erklärt und das wollte überhauptnicht v.v.
BIs mein Prog wengstens soweit liefv wie jetzt hats gedaurt.

Hier mein Code(So halbwegs sortiert, sind schon ein paar fruststunden ins land gegangen, und wurde frustriert mehrmals geändert und nicht gesäubert^^")

Der Server macht ne BlockedNamedPipe auf, blockt zwar die Serverform, aber ich wollte ausschließen dass es vorher an meiner Threadstruktur gelegen hat. Die jetzige Programmstruktur ist vielleicht nicht ordentlich(das ging beim frust verloren), aber wnen es einmal richtig klappt, hol och dass nach und packs auch in nützlichere klassen. Server und client sindimo beide in ButtonClickevents.

[Server]
Code:
var
  FConnected, FSuccess: LongBool;
  Buffer, Buffer2: PAnsiChar;
  FPipe: THandle;
  LMSG, LMSG2: String;
  CbBytesRead, CbWritten: Cardinal;
const
  PipeName: PChar = '\\.\pipe\TimePipeMega' + #0;
begin
  GetMem(Buffer, 2048);
  GetMem(BUffer2, 2048);
  while true do
  begin
    FPipe := CreateNamedPipe(PipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE
                              or PIPE_READMODE_MESSAGE or PIPE_WAIT, 1,
                              2048,2048, 1000, nil);
    if FPipe <> INVALID_HANDLE_VALUE then
    begin
      FConnected := ConnectNamedPipe(FPipe, nil);
      if FConnected then
      begin
        FSuccess := ReadFile(FPipe, Buffer^, 2048, CbBytesRead, nil);
        SetLength(LMSG, CbBytesRead);
        Move(Buffer^, LMSG[1], CbBytesRead);
        if LMSG = 'GETTIME' then
        begin
          MessageBOx(0,PChar(LMSG), 'arrived', 0);
        end;
        MessageBox(0, PChar(LMSG), 'x.x', 0);
        MessageBox(0,PChar(IntToStr(CbBytesRead)), 'o.o', 0);
        FlushFileBuffers(FPipe);
        DisconnectNamedPipe(FPipe);
        CloseHandle(FPipe);
      end;
    end;
    Sleep(1000);
  end;
  FreeMem(Buffer);
  FreeMem(Buffer2);
end;
[Client]
Code:
procedure TForm2.Button1Click(Sender: TObject);
var
  Send: String;
  RecString: String[255];
  Re, BytestoWrite: Cardinal;
  Pipe: String;
  PipeHandle: THandle;
  Buffer, Buffer2: PChar;
begin
  Pipe := '\\192.168.1.221\pipe\TimePipeMega';
  Send := 'GETTIMEHOLADIO';
  GetMem(Buffer, 2048);
  GetMem(Buffer2, 2048);
  BytesToWrite := Length(Send)+16;
  Move(Send[1], Buffer^, 30);

  PipeHandle := CreateFile (PChar(Pipe), // pipe name
  GENERIC_READ or
  GENERIC_WRITE, // read and write access
  0, // Not shared
  nil, // No security attributes
  OPEN_EXISTING, // opens existing pipe
  0, // default attributes
  0 ); // No template
   WriteFile(PipeHandle,Buffer^, Length(Send)+2, RE, nil);
  FreeMem(Buffer);
  FreeMem(Buffer2);
end;

MFG
Memnarch

Bummi 24. Sep 2010 15:43

AW: Pipes: Eintreffende Nachrichten sind zu kurz
 
Du hast Delphi2010, seit Delphi 2009 muß Du wegen der Unicodefähigkeit aufpassen.
Nimm in Deinem Fall am einfachsten überall AnsiString wo jetzt :String steht.

Memnarch 24. Sep 2010 15:59

AW: Pipes: Eintreffende Nachrichten sind zu kurz
 
Wow, vielen Dank^^.

Werde mir lieber nochmal String/AnsiString genauer anschauen damit ich mich damit nicht wieder auf die Nase lege^^


Danke nochmals.


MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 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