Einzelnen Beitrag anzeigen

Benutzerbild von Memnarch
Memnarch

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

Pipes: Eintreffende Nachrichten sind zu kurz

  Alt 24. Sep 2010, 15: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