2009-11-12 3 views
0

J'ai actuellement un petit script Python que j'utilise pour engendrer plusieurs exécutables, (serveurs de chat vocal), et dans la prochaine version du logiciel, les serveurs ont la capacité de recevoir des signaux de pulsation sur le port UDP. (Il y aura peut-être des milliers de serveurs sur une machine, allant des ports 7878 et plus)Plusieurs programmes utilisant le même port UDP? Possible?

Mon problème est que ces serveurs pourraient (lire: vont) fonctionner sur la même machine que mon script Python et que j'avais prévu sur ouvrir un port UDP, et juste envoyer le battement de coeur, attendre la réponse, et voila ... Je pourrais redémarrer des serveurs quand/s'ils ne répondaient pas en tuant la tâche et en rechargeant le serveur.

Le problème est que je ne peux pas ouvrir un port UDP que le serveur utilise déjà. Y a-t-il un moyen de contourner ceci? Le responsable du projet est en train de mettre en œuvre le rythme cardiaque, donc je suis sûr que toute suggestion sur la façon dont le système de pulsations pourrait être implémenté serait la bienvenue également. - Ceci est un script assez générique qui pourrait s'appliquer à d'autres programmes, mon objectif principal est toujours de communiquer sur ce port UDP.

Répondre

2

Ceci n'est pas possible. Ce que vous devez faire est d'avoir un programme maître UDP qui gère toutes les communications UDP sur un port, et communique avec vos serveurs d'une autre manière (UDP sur différents ports, canaux nommés, ...)

+0

Ce n'est pas possible par définition. Un programme par port est le mode de fonctionnement de UDP (et TCP). Un programme peut envoyer à d'autres programmes. –

+0

Vous avez raison, à travers l'OS, c'est impossible. Si vous avez un accès brut à l'adaptateur réseau (via 'libpcap' ou similaire), ce serait possible, mais pas joli ... – Wim

+0

Existe-t-il un moyen de mise en œuvre autour de cela, comme éventuellement l'implémentation de la pulsation d'une manière spécifique? Peut-être que je peux envoyer un paquet de diffusion, et avoir la réponse envoyée à un port ouvert? Tous les serveurs obtiendraient le paquet, et pourraient être chargés de répondre à 7877 peut-être? - Le chef de projet est ouvert à des choses comme celle-ci, je le soupçonne. – ThantiK

1

I ' m assez sûr que c'est possible sur Linux; Je ne connais pas d'autres UNIX.

Il y a deux façons de propager un descripteur de fichier d'un processus à l'autre:

  • Lorsque s une fourchette de processus(), l'enfant hérite de tous les descripteurs de fichiers du parent.
  • Un processus peut envoyer un descripteur de fichier à un autre processus via un "socket de domaine UNIX". Voir sendmsg() et recvmsg(). En Python, le module d'extension _multiprocessing le fera pour vous; voir _multiprocessing.sendfd() et _multiprocessing.recvfd().

Je n'ai pas expérimenté plusieurs processus d'écoute sur des sockets UDP. Mais pour TCP, sur Linux, si plusieurs processus écoutent tous sur un seul socket TCP, l'un d'entre eux sera choisi au hasard quand une connexion entre. Donc je suppose que Linux fait quelque chose de sensible quand plusieurs processus écoutent tous sur le même UDP prise.

Essayez-le et faites-le nous savoir!

Questions connexes