função para saber posição de conexão com socket

Delphi

20/12/2007

oi,
seguindo algumas dicas eu to conseguindo fazer um gerenciador de conexões,eu peguei esta função que será usada para saber a posição do cliente conectado e adaptei oa meu prog.

Function TForm1.LocalizaCliente(Cli : Pointer):Integer;
Begin
Result := IDConexoes.IndexOf(Cli);
End;


porém, acho que fiz algo errado, pois dá estes erros:

[Error] unit_sig.pas(45): Undeclared identifier: ´LocalizaCliente´
[Error] unit_sig.pas(45): ´;´ expected but ´(´ found
[Error] unit_sig.pas(47): Undeclared identifier: ´Result´
[Error] unit_sig.pas(47): Missing operator or semicolon
[Error] unit_sig.pas(84): Undeclared identifier: ´LocalizaCliente´
[Fatal Error] proje_siglan.dpr(6): Could not compile used unit ´unit_sig.pas´

para criar a função eu tenho que declarar algo antes?
do jeito que estava eu só alterei os nomes.

esta função será usada no evento onclientread de um server socket.
vejam:


Var Msg : String;
IDCli : integer;
HoraStr : String;
begin
Msg := socket.ReceiveText;
If Msg = ´HORA?´ then
Begin
IDCli := LocalizaCliente(Socket.Data);
HoraStr := FormatDateTime(´HH:mm:ss´,Now);

If (IDCli >= 0) then
Servidor.Socket.Connections[IDCli].SendText(HoraStr);
end;
end;


percebi que a função não é identificada.
o que está errado?

desde já agradeço.


Etspaz

Etspaz

Curtidas 0

Respostas

Etspaz

Etspaz

20/12/2007

eu mudei um pouco para continuar estudando, mas agora quando quando tenho varias conexoes simultaneas e envio varias mensagens da este erro:
[b:f665570553]LIST INDEX OUT OF BOUNDS (2)[/b:f665570553]

vou colocar todo codigo pra ficar mais claro.
 
public
    { Public declarations }
    IDConexoes : TList;
    conexoes: TList;
    tempo: TTime;

  end;

var
  Form1: TForm1;

implementation


uses Unit_login;


{$R *.dfm}

//Function TForm1.LocalizaCliente(Cli : Pointer):Integer;
//Begin
//Result := IDConexoes.IndexOf(Cli);
//End;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //if (Tempo >= STrToTime(´00:00:00´)) then
  //begin
   // Label1.caption := TimeToStr(Tempo - StrToTime(´00:00:01´));
    //Tempo:= Tempo - StrToTime(´00:00:01´);
 // end
  //else
 // begin
  //Timer1.Enabled:=false;
 // ShowMessage(´ee´);
 // end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Tempo := StrToTime(´00:00:20´);
Servidor.Active := True;
//IDConexoes := TList.Create;
//IDConexoes.Clear;
conexoes:= TList.Create;

end;

procedure TForm1.servidorClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
// este é o primeiro jeito !!!
 // Var Msg : String;
//IDCli : integer;
//HoraStr : String;
//begin
//Msg := socket.ReceiveText;
//If Msg = ´HORA?´ then
 //Begin
  //IDCli := LocalizaCliente(Socket.Data);
 // HoraStr := FormatDateTime(´HH:mm:ss´,Now);

//If (IDCli >= 0) then
 // Servidor.Socket.Connections[IDCli].SendText(HoraStr);
//end;




// este é o segundo jeuto!!!!
 //  Var MsgRecebida : String;
//I : integer;/
//begin
 // MsgRecebida := socket.ReceiveText;  // Pega o conteúdo enviado

//  For i := 0 to servidor.Socket.ActiveConnections-1 do
  //   Servidor.Socket.Connections[i].SendText(MsgRecebida);

//end;


//este é o terceiro jeito !!!
var msg : string;
      NumConex : integer;
begin
NumConex := Conexoes.IndexOf(Socket.Data);

if NumConex >= 0 then
  Begin
     msg := socket.ReceiveText; // pego a menssagem q chegou
     msg := AnsiLowerCase(msg); // transformo todas as letras para minuscula
     servidor.Socket.Connections[NumConex].SendText(msg);  //envio d volta pra
   //                                   //  quem enviou
  end;
end;







procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//IDConexoes.Free; 
end;

procedure TForm1.servidorClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
  Var IDsocket : ^String; // Variavel utilizada par identificar o sockets
begin
 New(IDSocket);
 Socket.Data := IDSocket;
 Conexoes.Add(Socket.data);
end;

//Var
//IDsocket : ^byte;
//begin
 //New(IDSocket);
 //Socket.Data := IDSocket;
 //IDConexoes.Add(Socket.data);
//end;
 

procedure TForm1.servidorClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
//Var
// NumConex : integer;
Begin
//IDConexoes.Remove(Socket.Data);
//Dispose(Socket.Data);
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
conexoes.Destroy;
end;

end


onde está comentado são os exemplos que eu testei primeiro, o que está como primeiro jeito foi o que deu problema na função que citei no post.


GOSTEI 0
Etspaz

Etspaz

20/12/2007

bom dia pessoal,
eu to evoluindo, a comunicação entre os clientes e o servidor está funcionando, mas quero que os clientes se comuniquem, neste caso, um cliente envia uma mensagem ao servidor que repassa ao cliente que eu desejo que receba esta mensagem, certo?
minhas duvidas são:

1- coloquei um combobox no cliente para ele poder selecionar o cliente que receberá a mensagem, porém não to conseguindo fazer com que o servidor envie a lista dos clientes conectados pra este que acabou de se conectar atualizar seu combo e quando um se desconecta também tem que ser atualizado o combo dos que permanecem conectados.

2- quando o servidor receber a mensagem vai tratar e se não for pra ele envia para o destinatario, aí devo por um flag pra cada posição do combo do cliente e de acordo com o selecionado quando o cliente enviar acrescento na mensagem este flag (teria que ter um pro server também ) para o servidor saber pra quem é a mensagem?
ou outro jeito?

espero ter sido claro e se alguém puder me ajudar, agradeço.


GOSTEI 0
POSTAR