Pular para o conteúdo

Implementação de ping-pong

Responder tópico
  • Denunciar
  • Indicar

1. Implementação de ping-pong

Enviado em 20/01/2016 - 20:53h

Eu estava querendo implementar uma conexão socket com ping-pong, da mesma forma que tem no irc, server-side. Para assim poder remover clientes que não respondem.

Estou com dúvida de como fazer isso da maneira mais eficiente, correta e segura.

Digamos, eu tenho um server, ele espera até receber uma mensagem e então gera uma resposta e a envia. Isso ocorrendo em um loop.

Enquanto ele está esperando não é possível enviar um "ping", eu vou ter que usar duas threads uma para comunicação em sí e uma para o ping-pong?
E aí quando ele não responde na thread do ping, deleto o cliente, certo? Como vou deleta - lo ? Encerando o processo e dando um close no socket?

É isso que eu tenho que fazer?

----
Eu tenho muitas dúvidas a respeito de sockets. Se alguém me indicar um materia ficaria muito grato!
Pode ser livro ou qualquer outra coisa, mas eu quero aprender a usar isso direito de uma vez por todas!

Responder tópico

2. Re: Implementação de ping-pong

Enviado em 23/01/2016 - 06:42h

Não precisa de múltiplas threads. Você pode usar (como alternativas, não ao mesmo tempo) select(), poll(), epoll(), I/O assíncrono com a opção O_ASYNC no socket ou I/O assíncrono POSIX (consulte a manpage de aio(7)).

EDIT: Reparei depois que você usa FreeBSD. Nesse caso, você pode preferir usar kqueue()/kevent().

3. Re: Implementação de ping-pong

Enviado em 23/01/2016 - 14:05h

paulo1205 escreveu:

Não precisa de múltiplas threads. Você pode usar (como alternativas, não ao mesmo tempo) select(), poll(), epoll(), I/O assíncrono com a opção O_ASYNC no socket ou I/O assíncrono POSIX (consulte a manpage de aio(7)).

EDIT: Reparei depois que você usa FreeBSD. Nesse caso, você pode preferir usar kqueue()/kevent().
Muito obrigado!! Vou dar uma olhada nessa manpage.

4. NonBlock

Enviado em 30/01/2016 - 16:08h

Você precisa aceitar o cliente como nonBlock (não bloqueia a thread). Assim se ele não receber mensagem ele retorna zero, e se o cliente desconectou ele retorna -1.

http://www.cs.tau.ac.il/~eddiea/samples/Non-Blocking/tcp-nonblocking-server.c.html

Mas você também pode fazer a sua aplicação dar um ping. É só abrir um pipe semelhante a abrir um arquivo. Mas ao invés de fopen() a função usada é a popen(), e o nome do arquivo é o comando desejado.
EX:

//abrindo um pipe para ping no google
FILE* pipe = popen("ping -c 1 google.com","r"); //executa o ping apenas uma vez
if(pipe){
//faz a leitura da string como você quiser
pclose(pipe);
}
OBS: Dependendo do tamanho do retorno. O tamanho do pipe pode variar com o tempo. Se você escrever o comando "ls -R /", o sistema operacional vai ficar um bom tempo escrevendo no pipe até chegar ao fim.

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder