procedure TFrmGerenciador.SERVERExecute(AContext: TIdContext);
var
byteBuf : TIdBytes;
Buffer : array [1..1024] of byte;
BufferSec : array [1..1024] of byte;
hexComado : string;
i : integer;
rx, tx : TRxTx;
tamStr : integer;
sComandoSec : string;
begin
try
FillChar(Buffer, SizeOf(Buffer), 0);
AContext.Connection.IOHandler.ReadBytes(byteBuf, 12, false);
idGlobal.BytesToRaw(byteBuf, Buffer, 12);
hexComado := '';
for i := 1 to 12 do
begin
hexComado := hexComado + IntToHex(Ord(Buffer[i]), 2);
end;
rx := strToRxTx(hexComado);
if(rx.tamanho > 0) then
begin
FillChar(BufferSec, SizeOf(BufferSec), 0);
AContext.Connection.IOHandler.ReadBytes(byteBuf, rx.tamanho + 1, false);
idGlobal.BytesToRaw(byteBuf, BufferSec, rx.tamanho + 1);
sComandoSec := '';
for i := 1 to rx.tamanho + 1 do
begin
sComandoSec := sComandoSec + IntToHex(Ord(BufferSec[i]), 2);
end;
rx.dados := RetZero(sComandoSec, 1024, false);
end;
tx := trataComandoPlaca(rx); // AQUI TRATA O COMANDO RECEBIDO DA CONTROLADORA
hexComado := RxTxtoStr(tx);
tamStr := length(hexComado) div 2;
FillChar(Buffer, SizeOf(Buffer), 0);
for i := 1 to tamStr do
begin
Buffer [i + 1] := HexToDec(hexComado[(i*2)+1] + hexComado[(i*2)+2]);
end;
byteBuf := Idglobal.RawToBytes(Buffer, tamStr);
AContext.Connection.IOHandler.Write(byteBuf);
except on e:Exception do
begin
AContext.Connection.DisconnectNotifyPeer;
end;
end;
end;
function TFrmGerenciador.enviarComando(TX: TRxTx; resposta: Boolean): TRxTx;
var
hexComado, sComandoSec : WideString;
buf, rxBuf : array [1..1024] of byte;
bufSec : array [1..1024] of byte;
tamStr, i,M : integer;
rx : TRxTx;
byteBuf : TIdBytes;
begin
for m := 1 to 2 do
begin
sockets[m] :=TidTCPClient.Create;
sockets[M].Disconnect;
sockets[M].DisconnectNotifyPeer;
sockets[M].Host := ListaDeIps.Strings[m];
sockets[M].Port := 9760;
sockets[M].ConnectTimeout := -1;
sockets[M].IPVersion := Id_IPv4;
sockets[M].ReadTimeout := -1;
sockets[M].ReuseSocket := rsFalse;
sockets[M].Connect;
if(not sockets[m].Connected) then
//if(not tcp.Connected) then
begin
try
sockets[m].connect();
//tcp.Connect();
except
exit;
end;
end;
if(not sockets[m].Connected) then
//if(not tcp.Connected) then
exit;
rx.stx := 0;
rx.tamanho := 0;
rx.id_destino := 0;
rx.id_sub_destino := 0;
rx.id_fonte := 0;
rx.comando := '0000';
rx.dados := '';
rx.chksum := 0;
rx.etx := 0;
try
FillChar(buf, SizeOf(buf), 0);
// Comunicando := true;
//tx.chksum := calculaCK(tx);
hexComado := RxTxtoStr(tx);
tamStr := length(hexComado) div 2;
for i := 0 to tamStr - 1 do
begin
buf [i + 1] := HexToDec(hexComado[(i*2)+1] + hexComado[(i*2)+2]);
end;
if(tx.tamanho > 0) then
begin
byteBuf := Idglobal.RawToBytes(buf, 13 + tx.tamanho);
//tcp.IOHandler.Write(byteBuf);
Sockets[m].IOHandler.Write(byteBuf);
end
else
begin
byteBuf := Idglobal.RawToBytes(buf,12);
// tcp.IOHandler.Write(byteBuf);
Sockets[m].IOHandler.Write(byteBuf);
end;
if(resposta = true) then
begin
//tcp.IOHandler.ReadTimeout := 2000;
//tcp.IOHandler.ReadBytes(byteBuf, 12, false);
Sockets[m].IOHandler.ReadTimeout := 2000;
Sockets[m].IOHandler.ReadBytes(byteBuf, 12, false);
idGlobal.BytesToRaw(byteBuf, rxBuf, 12);
hexComado := '';
for i := 1 to 12 do
begin
hexComado := hexComado + IntToHex(Ord(rxBuf[i]), 2);
end;
rx := strToRxTx(hexComado);
rx.id_fonte := 0;
if(rx.tamanho > 0) then
begin
FillChar(bufSec, SizeOf(bufSec), 0);
// tcp.IOHandler.ReadTimeout := 2000;
//tcp.IOHandler.ReadBytes(byteBuf, rx.tamanho +1, false);
Sockets[m].IOHandler.ReadTimeout := 2000;
Sockets[m].IOHandler.ReadBytes(byteBuf, rx.tamanho +1, false);
idGlobal.BytesToRaw(byteBuf, bufSec, rx.tamanho +1);
sComandoSec := '';
for i := 1 to rx.tamanho +1 do
begin
sComandoSec := sComandoSec + IntToHex(Ord(bufSec[i]), 2);
end;
rx.dados := RetZero(sComandoSec, 1024, false);
end;
Result := rx;
end;
except on e:Exception do
begin
rx.stx := 0;
rx.tamanho := 0;
rx.id_destino := 0;
rx.id_sub_destino := 0;
rx.id_fonte := 0;
rx.comando := '0000';
rx.dados := '';
rx.chksum := 0;
rx.etx := 0;
Result := rx;
//tcp.Disconnect;
Sockets[m].Disconnect;
end;
end;
end;
end;
Pessoal estou com um problema,onde o meu TcpServer Esta enviando a resposta para todos os Tcpclient Que estão conectados.
Como faço para o TcpServer enviar a resposta somete para o tcpClient que enviou o comando,resumindo o Cliente que mandar o comando so ele receber a resposta do servidor.
esses são os códigos que estou usando,alguém pode me ajudar onde estou errando aqui ?