268 votes

Deux applications écoute sur le même port?

Aussi simple que cela - peut deux applications sur le même ordinateur lier le même port et l'adresse ip? Prendre une étape supplémentaire, peut-on app écouter les demandes provenant d'une ip et de l'autre à un autre à distance ip? Je sais que je peux avoir une application qui commence deux threads (ou fourche) ont un comportement similaire, mais deux applications qui n'ont rien en commun à faire de même?

merci.

240voto

Chris Dail Points 11406

Pour TCP, pas. Vous ne pouvez avoir qu'une seule application à l'écoute sur un port unique à la fois. Maintenant, si vous avez eu 2 cartes réseau, vous pourriez avoir une application écouter sur l'adresse IP et le deuxième sur le deuxième IP en utilisant le même numéro de port.

Pour UDP (Multidiffusion), plusieurs applications peuvent s'abonner sur le même port.

120voto

JNewton Points 177

Oui (pour TCP) vous pouvez avoir deux programmes écouter sur le même socket, si les programmes sont conçus pour faire. Si la socket est créé par le premier programme, assurez-vous que l' SO_REUSEADDR option est définie sur le support avant d' bind(). Toutefois, cela peut ne pas être ce que vous voulez. Ce que cela fait, c'est une connexion TCP entrante sera dirigé vers l'un de ces programmes, pas les deux, afin de ne pas dupliquer la connexion, il permet tout simplement de deux programmes de service à la demande entrante. Par exemple, les serveurs web ont de multiples processus tout à l'écoute sur le port 80, et l'O/S envoie une nouvelle connexion pour le processus qui est prêt à accepter de nouvelles connexions.

SO_REUSEADDR

Permet à d'autres sockets bind() de ce port, à moins qu'il y est une écoute active socket lié au port déjà. Cela vous permet d'obtenir autour de ces "Address already in use" des messages d'erreur lorsque vous essayez de redémarrer votre serveur après un crash.

47voto

Javier Points 33134

En principe, non.

Il n'est pas écrit dans la pierre; mais c'est la façon dont toutes les Api sont écrits: l'application ouvre un port, obtient une poignée, et les OS informe (par le biais de la poignée) lors d'une connexion client (ou un paquet UDP cas) arrive.

Si le système d'exploitation a permis à deux applications pour ouvrir le même port, comment serait-il savoir que l'on à en informer?

Mais... il y a des façons de contourner cela:

  1. Que Jed a noté, vous pourriez écrire un "maître", qui serait le seul qui a vraiment le port, et informe les autres, en utilisant toute logique, il veut séparer les demandes des clients.
  2. Sur les systèmes Linux et BSD (au moins), vous pouvez mettre en place "remappage" règles qui redirige les paquets à partir du "visible" port différent (où les applications sont à l'écoute), selon l'une quelconque réseau des critères liés à la (peut-être que le réseau d'origine, ou de certaines formes simples de l'équilibre de la charge).

47voto

EJP Points 113412

Oui.

  1. Plusieurs écoute sockets TCP, tous liés au même port, peuvent co-exister, à condition qu'ils soient tous liés à différentes adresses IP locales. Les Clients peuvent se connecter à celui dont ils ont besoin pour. Cela exclut 0.0.0.0 (INADDR_ANY).

  2. Plusieurs accepté sockets peuvent co-exister, acceptés à partir de la même socket d'écoute, tous ayant le même numéro de port que le socket d'écoute.

  3. Plusieurs sockets UDP tous liés au même port peut co-exister le même état qu'au (1) ou qu'ils aient tous eu l' SO_REUSEADDR option avant de liaison.

  4. Les ports TCP et UDP ports occupent des espaces de noms différents, de sorte que l'utilisation d'un port pour le protocole TCP n'empêche pas son utilisation pour UDP, et vice versa.

Référence: Stevens & Wright, TCP/IP Illustré, Volume II.

18voto

Jed Smith Points 9022

Pas de. Une seule application peut se lier à un port, à un moment, et le comportement si la liaison est forcée est de durée indéterminée.

Avec la multidiffusion sockets -- qui sonnent comme nulle part près de ce que vous voulez -- plus d'une application peut se lier à un port aussi longtemps que SO_REUSEADDR est installé dans chaque socket options.

Vous pourriez faire cela par l'écriture d'un "maître", qui accepte et traite toutes les connexions, puis les mains à vos deux applications qui en ont besoin à l'écoute sur le même port. C'est l'approche que les serveurs Web et tel de prendre, depuis de nombreux processus ont besoin d'écouter à 80.

Au-delà de cela, nous sommes en obtenant dans les détails -- vous tagged TCP et UDP, qui est-il? Aussi, quelle plate-forme?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: