Implementação de ping-pong

1. Implementação de ping-pong

Arthur J. Hoch
Arthur_Hoch

(usa FreeBSD)

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!


  


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

Paulo
paulo1205

(usa Ubuntu)

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

Arthur J. Hoch
Arthur_Hoch

(usa FreeBSD)

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

Eduardo Moura Sales Martins
Edimartin

(usa Ubuntu)

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.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts