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