2009-11-24 11 views
2

est-il un moyen de mettre en file d'attente des paquets à une socket en Python? J'ai cherché quelque chose comme la bibliothèque libipq, mais je ne trouve rien d'équivalent.File d'attente de paquets en Python?

Voici ce que je suis en train d'accomplir:

  1. Créer connexion socket TCP entre le serveur et le client (à la fois sous mon contrôle).
  2. Essayez la transmission de données (en attente de connexion à la faute - par exemple, le client perd la connectivité en raison de la fermeture ordinateur portable)
  3. Catch SocketException et tenir aux données qui a été d'essayer d'être envoyé tout en gardant les données restantes en attente (dans une file d'attente?)
  4. Entrez pour essayer de se reconnecter en boucle (en supposant que le succès est inévitable )
  5. Créer un nouveau socket sur le succès
  6. transmission de données de CV

Des suggestions? Est-ce que Twisted peut faire ça? Dois-je impliquer pcapy? Dois-je le faire (sockets, files d'attente, etc) en C et utiliser Boost pour faire du code hybride?

Merci d'avance.


Edit 1:

Réponse à Nick:

Je laisse le fait que les données que je vais transmettrons sera généralisée et sans fin - penser cette application assis sous une session ssh (je ne suis pas en aucune façon en essayant de jeter un coup d'oeil dans les paquets ). Ainsi, la transmission sera bilatérale. Je veux être en mesure d'aller du bureau à ma maison (en fermant mon ordinateur portable entre les deux), ouvrez l'ordinateur portable au domicile et continuez dans ma session de façon transparente. (Je sais que SCREEN existe). Cela pourrait vous amener à vous demander comment il fonctionnerait sans proxy. Ce ne sera pas, je n'ai pas expliqué ce design. Avec le contexte ajouté Blockquote

, je dois dire aussi que je ne vais pas devoir prendre un SocketException sur le côté serveur car cette machine sera (ou suppose être) fixe. Lorsque le client découvre qu'il a de nouveau la connectivité, il se reconnecte au serveur.

Répondre

0

Je vous suggère de mettre en œuvre un protocole d'application, donc lorsque le client reçoit des données, il le reconnaît au serveur, avec un numéro de série pour chaque bit de données.

Le serveur conserve ensuite la note du numéro de série dont le client a besoin et l'envoie. Si la connexion est rompue, le serveur la récupère.

Les données pourraient être tamponnées comme vous le souhaitez, mais je le garderais simple pour commencer et utiliser un deque probablement qui est un peu plus efficace qu'un list pour prendre des données du début et de la fin.

Je créerais probablement un objet Packet qui a un attribut de numéro de série, et un moyen de sérialiser et de le désérialiser et ses données dans un flux d'octets (par exemple en utilisant netstrings). Vous stockez ensuite ces paquets dans votre deque. Vous feriez sortir le paquet du deque et chaque fois que vous receviez un accusé de réception du client et envoyez le suivant.

De tels protocoles ont beaucoup de cas d'angle, des délais d'attente sont nécessaires et sont généralement gênants pour le débogage. Regardez le code source d'un serveur SMTP un jour si vous voulez une idée! Comme pour les sockets, vous pouvez facilement implémenter cela avec des sockets python normales et voir comment ça se passe. Si vous prévoyez d'avoir beaucoup de clients à la fois alors tordu sera une bonne idée.

+0

J'ai laissé de côté le fait que les données que je transmettrai seront généralisées et interminables - pensez à cette application placée sous une session ssh (je n'essaie en aucun cas de jeter un coup d'œil dans les paquets). Donc, la transmission sera bilatérale. Je veux pouvoir aller du bureau à la maison (fermer mon ordinateur portable entre les deux), ouvrir l'ordinateur portable à la maison et continuer ma session en toute transparence. (Je sais que SCREEN existe). Cela pourrait vous amener à vous demander comment cela fonctionnerait sans proxy. Ce ne sera pas, je n'ai tout simplement pas expliqué ce design. Merci à Nick! – Kevin