Pergunta

Existe alguma maneira de fazer fila de pacotes para um soquete em Python? Eu tenho procurado algo como o libipq Biblioteca, mas não consigo encontrar nada equivalente.

Aqui está o que estou tentando realizar:

  1. Crie conexão de soquete TCP entre o servidor e o cliente (ambos sob meu controle).
  2. Tente transmitir dados (aguardando a conexão para a falha - por exemplo, o cliente perde a conectividade por causa do fechamento do laptop)
  3. Truque SocketException e segure os dados que estavam tentando ser enviados enquanto mantêm os dados restantes esperando (em uma fila?)
  4. Entre no loop tentando se reconectar (assumindo que o sucesso é inevitável)
  5. Crie novo soquete após o sucesso
  6. Retomar a transmissão de dados

Alguma sugestão? Twisted pode fazer isso? Eu preciso envolver pcapy? Devo fazer isso (soquetes, filas, etc.) em C e usar o Boost para criar código híbrido?

Desde já, obrigado.


Editar 1:

Resposta a Nick:

Deixei de fora o fato de que os dados que transmitirão serão generalizados e sem fim - pense neste aplicativo em uma sessão SSH (não estou de nenhuma maneira tentando espiar os pacotes). Portanto, a transmissão será bilateral. Quero poder ir do escritório para minha casa (fechando meu laptop no meio), abrir o laptop em casa e continuar na minha sessão sem problemas. (Eu sei que a tela existe). Isso pode levar você a se perguntar como funcionaria sem proxies. Não vai, eu não expliquei esse design. Bloco de citação

Com o contexto adicional, também devo dizer que não terei que pegar um SocketException No lado do servidor, pois essa máquina será (ou assume ser fixa). Quando o cliente descobrir que ele tem conectividade novamente, ele se reconectará ao servidor.

Foi útil?

Solução

Sugiro que você implemente um protocolo de aplicativo; portanto, quando o cliente recebe dados, ele o reconhece no servidor, com um número de série para cada bit de dados.

O servidor mantém nota de qual número de série o cliente precisa a seguir e o envia. Se a conexão quebrar, o servidor o relembrará.

Os dados podem ser buffer de qualquer maneira que você quiser, mas eu mantinha simples de começar e usar um deque provavelmente o que é um pouco mais eficiente do que um list para obter dados do início e fim.

Eu provavelmente criaria um objeto de pacote que possui um atributo de número de série, e uma maneira de serializar e não irializá -lo e seus dados para um fluxo de bytes (por exemplo, usando NetStrings). Você então armazenaria esses pacotes em seu deque. Você tocava o pacote do deque e sempre que recebia um reconhecimento do cliente e enviava o próximo.

Esses protocolos têm muitos casos de canto, os tempos necessários e geralmente são irritantes para depurar. Veja o código -fonte de um servidor SMTP algum dia, se quiser uma ideia!

Quanto aos soquetes, você pode implementar facilmente isso com soquetes normais do Python e ver como vai. Se você planeja ter muitos clientes de uma vez, Twisted será uma boa ideia.

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