18-03-2025, Saat: 04:37
Selam arkadaslar. bir turlu coze bilmirem. TCP ile command veriyorum, Cevabi yarimciq gelir. anlamiram neden!
Kodu verirem.
Bazi serverlerde calisir full responsedi TCP veriyor, abzilarinda yok. fakat ben bakiyorum basga programalda, yarimciq response cevabini gosterende Project1, basga softwarelerle bakdikda full response gorunuyor. Burada hata nerede?
Bua rada misal olaraq:
Response := TCPClient.IOHandler.ReadLn(); deyisdirib Response := TCPClient.IOHandler.ReadLn(#1234); veya Response := TCPClient.IOHandler.ReadLn(#3000) ve sair yazinca full gosterir amma yenede dogru calismaz, yardimci olsaniz sevinerem;
Kodu verirem.
Kod: (Select All)
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Forms,
Vcl.StdCtrls, Vcl.ComCtrls, IdTCPClient, IdGlobal, IdBaseComponent,
IdComponent, IdTCPConnection, Vcl.Controls, Vcl.Imaging.jpeg, Vcl.ExtCtrls,
IdCustomTCPServer, IdTCPServer;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
RichEdit1: TRichEdit;
IdTCPClient1: TIdTCPClient;
procedure Button1Click(Sender: TObject);
private
function BytesToHex(const Bytes: TIdBytes): string;
function HexBytesToDecimal(HexStr: string): Integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.HexBytesToDecimal(HexStr: string): Integer;
var
CleanHex: string;
begin
CleanHex := StringReplace(HexStr, ' ', '', [rfReplaceAll]);
Result := StrToInt('$' + CleanHex);
end;
function TForm1.BytesToHex(const Bytes: TIdBytes): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(Bytes) - 1 do
Result := Result + IntToHex(Bytes[i], 2) + ' ';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TCPClient: TIdTCPClient;
HelloZGW, ResponseBytes: TIdBytes;
serverIP: string;
Response: string;
HexStr: string;
hexString: string;
byteCount, i: Integer;
begin
serverIP := Trim(Edit1.Text);
if serverIP = '' then
begin
RichEdit1.Lines.Add('Please enter a valid server IP in Edit2.');
Exit;
end;
hexString := Trim(Edit2.Text);
hexString := StringReplace(hexString, ' ', '', [rfReplaceAll]);
if (Length(hexString) mod 2) <> 0 then
begin
RichEdit1.Lines.Add('Invalid hex string. The number of hex digits must be even.');
Exit;
end;
byteCount := Length(hexString) div 2;
SetLength(HelloZGW, byteCount);
for i := 0 to byteCount - 1 do
HelloZGW[i] := StrToInt('$' + Copy(hexString, 2 * i + 1, 2));
TCPClient := TIdTCPClient.Create(nil);
try
TCPClient.Host := serverIP;
TCPClient.Port := 6801;
TCPClient.ConnectTimeout := 2000;
TCPClient.ReadTimeout := 2000;
try
TCPClient.Connect;
TCPClient.IOHandler.Write(HelloZGW);
Response := TCPClient.IOHandler.ReadLn();
TCPClient.IOHandler.ReadBytes(ResponseBytes, -1, False);
RichEdit1.Clear;
RichEdit1.Lines.Add(BytesToHex(ResponseBytes));
HexStr := StringReplace(BytesToHex(ResponseBytes), ' ', '', [rfReplaceAll]);
if Length(HexStr) >= 8 then
begin
HexStr := Copy(HexStr, Length(HexStr) - 7, 8);
end
else
RichEdit1.Lines.Add('Response too short for conversion.');
finally
if TCPClient.Connected then
TCPClient.Disconnect;
end;
except
on E: Exception do
RichEdit1.Lines.Add('Error connecting to ' + serverIP + ': ' + E.Message);
end;
TCPClient.Free;
end;
end.Bazi serverlerde calisir full responsedi TCP veriyor, abzilarinda yok. fakat ben bakiyorum basga programalda, yarimciq response cevabini gosterende Project1, basga softwarelerle bakdikda full response gorunuyor. Burada hata nerede?
Bua rada misal olaraq:
Response := TCPClient.IOHandler.ReadLn(); deyisdirib Response := TCPClient.IOHandler.ReadLn(#1234); veya Response := TCPClient.IOHandler.ReadLn(#3000) ve sair yazinca full gosterir amma yenede dogru calismaz, yardimci olsaniz sevinerem;


