AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Pipes: Eintreffende Nachrichten sind zu kurz

Pipes: Eintreffende Nachrichten sind zu kurz

Ein Thema von Memnarch · begonnen am 24. Sep 2010 · letzter Beitrag vom 24. Sep 2010
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

Pipes: Eintreffende Nachrichten sind zu kurz

  Alt 24. Sep 2010, 16:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Pipes: Eintreffende Nachrichten sind zu kurz

  Alt 24. Sep 2010, 16:43
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: Pipes: Eintreffende Nachrichten sind zu kurz

  Alt 24. Sep 2010, 16:59
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:44 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