Pergunta

Para o trabalho que eu preciso para escrever um daemon tcp para responder ao nosso software de cliente e queria saber se alguém tinha alguma dica sobre a melhor maneira de fazer isto.

Devo garfo para cada nova ligação como normalmente eu usaria tópicos?

Foi útil?

Solução

Depende da sua aplicação. Fios e bifurcação podem ser ambas abordagens perfeitamente válidas, assim como a terceira opção de um modelo orientado a eventos single-threaded. Se você pode explicar um pouco mais sobre exatamente o que você está escrevendo, ele iria ajudar ao dar conselhos.

Por que vale a pena, aqui estão algumas diretrizes gerais:

  • Se você não ter estado compartilhado, uso de bifurcação.
  • Se você tem estado, utilização de fios ou um sistema orientado a eventos compartilhado.
  • Se você precisa de alta performance sob um grande número de conexões, evite bifurcação, pois tem maior sobrecarga (particularmente o uso de memória). Em vez disso, use tópicos, um loop de evento, ou várias linhas de loop evento (normalmente um por CPU).

Geralmente bifurcação será o mais fácil de implementar, como você pode essencialmente ignora todas as outras ligações, uma vez que desembolsar; tópicos a próxima mais difícil devido às exigências de sincronização adicionais; o ciclo de eventos mais difícil devido à necessidade de transformar a sua transformação em uma máquina de estado; e múltiplas threads em execução evento laços o mais difícil de todos eles (devido à combinação de outros fatores).

Outras dicas

Eu sugiro bifurcação para conexões mais tópicos qualquer dia. O problema com tópicos é o espaço de memória compartilhada, e como é fácil de manipular a memória de outro segmento. Com processos bifurcados, qualquer comunicação entre os processos tem que ser feito intencionalmente por você.

Apenas procurei e encontrei esta resposta SO: Qual é o propósito de garfo? . Você, obviamente, sabe a resposta para isso, mas o # 1 resposta nesse segmento tem bons pontos sobre as vantagens de fork ().

Além de resposta de @ hobodave bom, outro benefício de "bifurcação por conexão" é que você pode implementar seu servidor de maneira muito simples, usando inetd ou tcpserver ou similar: você pode usar a entrada padrão e saída padrão para comunicação com o socket, e não tem que fazer qualquer gestão escuta-socket (aguardando as conexões, etc.), etc.

Outra opção, é claro, é pré-bifurcação várias cópias do daemon e tendo cada um manter-se vivo e continuando a pedidos de resposta. Tudo depende de suas necessidades de aplicação, carga esperada e de desempenho, entre outras coisas.

A maneira mais fácil e mais simples é escrever um daemon baseado em inetd; o seu software pode ignorar o fato de que ele está sendo executado através de uma conexão TCP e simplesmente manipular a entrada / saída via stdin / stdout. Isso funciona bem na grande maioria dos casos.

Se você não está planejando para ser martelado com muitas novas conexões por segundo, considere executar a partir de inetd. Caso contrário ...

Faça o download do fonte OpenSSH. Eles colocaram um monte de trabalho para a separação de privilégios apenas para a direita, é portátil, e tem sido escrutinados para a segurança mais do que apenas sobre qualquer outra coisa.

adaptá-lo para as suas necessidades, você provavelmente pode jogar fora mais do mesmo. Cumprir com o contrato de licença é claro. Siga manchas futuras com uma boa SCC.

Não se preocupe com o desempenho de bifurcação processos vs tópicos até que você tenha uma boa evidência de que é um problema real. Apache foi por anos e anos executando os sites mais visitados com apenas o simples modelo de processo-per-cliente.

Se você for realmente ambicioso, você poderia usar algum tipo de um modelo IO sem bloqueio assíncrono. I como Boost.Asio, mas eu sou pesado em C ++.

Certifique-se de seus punhos do código de sinais corretamente. HUP para configuração de recarga. TERM para desligar graciosamente.

Não tente escrever seu próprio arquivo de log. Use syslog apenas, ou apenas escrever para stderr que pode ser redirecionado para syslog. É uma verdadeira dor tentando configurar logrotate em servidores domésticos laminados que todos os log de forma ligeiramente diferente.

Se você quiser enfiar evitar / bifurcação todos juntos, eu recomendo usar todos os non-blocking I / O juntamente com libevent . Libevent é bastante conhecido como uma solução de alto desempenho para programação orientada a eventos.

ACE (C ++ / Java) . Ele tem uma série de rosca, reatores evento, e que se bifurcam TCP que abordam suas necessidades de comunicação. Você também pode olhar para impulsionar ASIO que faz algo semelhante

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top