Fórum função para saber posição de conexão com socket #350876
20/12/2007
0
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.
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
Curtir tópico
+ 0
Responder
Posts
20/12/2007
Etspaz
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.
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.
[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;
endonde 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.
Responder
Gostei + 0
02/01/2008
Etspaz
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.
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.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)