8
votes

Comment écouter plusieurs adresses IP?

Si mon serveur dispose de plusieurs adresses IP qui lui ont été attribuées, et j'aimerais écouter certaines (ou toutes) d'entre eux, comment puis-je faire ça?

Dois-je créer une nouvelle prise pour chaque adresse IP et le lier? Puis-je lier plusieurs adresses IP sur une seule prise? Ipaddress.any est-ce que l'écoute de toutes les adresses IP? La bibliothèque MSDN n'est pas très peu claire à ce sujet.


0 commentaires

6 Réponses :


2
votes

Oui, iPaddress.any va écouter toutes les interfaces.

http://msdn.microsoft.com /en-us/library/system.net.ipaddress.any.aaspx


2 commentaires

OK, cela aide (la méthode de la liaison indique simplement que le cadre choisit l'adresse à écouter, ce qui est assez vague). Mais qu'en est-il si je veux seulement écouter sur 5 des 10 adresses IP attribuées à l'ordinateur? Ai-je besoin de 5 sockets pour ça? Ou puis-je appeler la liaison () plusieurs fois avec différents points d'extrémité?


Oui, vous un par adresse, sauf si vous ne liez aucune ou IPv6ANY.



4
votes

Techniquement, votre serveur n'a jamais d'adresses IP qui lui est attribuée.

Au lieu de cela, les interfaces réseau individuelles peuvent être attribuées des adresses IP. Habituellement, chaque carte réseau obtient une adresse IP, mais ce n'est que le cas le plus commun.

Si vous souhaitez contrôler les interfaces qui écoutent des connexions entrantes sur votre port choisi, vous devez créer une prise séparée pour chacune.


4 commentaires

Oui, je suis conscient que vous attribuez des adresses IP aux interfaces, mais que .NET se cache de vous et vous liez simplement aux points de terminaison. Je suis un peu confus pour que vous puissiez écouter les interfaces mulitaires avec IPADDRESS.Touille mais besoin de multiples prises pour écouter des spécifiques.


Je soupçonne que c'est un cas de "Faisons le cas commun facile à réaliser" par les concepteurs du cadre, fournissant un raccourci utile.


Toutes les raccourcis peuvent être considérées comme des raccourcis. Mais vous ne pouviez pas demander à un cadre de vous fournir tous les raccourcis que vous souhaitez. Je suis totalement d'accord avec Bevan. Lorsque vous jouez plus avec des cadres et que vous commencez à concevoir le vôtre, vous verrez qu'il est toujours difficile de faire des choix.


@Erikfunkenbusch Avez-vous découvert la réponse pour votre confusion? J'ai aussi la même confusion.



19
votes

Vous ne pouvez pas lier une seule douille à plusieurs points de terminaison. Un socketException (erreur d'argument non valide) se produit la deuxième fois que vous appelez Bind () pour une prise donnée.

Comme d'autres personnes ont dit, vous pouvez utiliser iPaddress.any pour écouter les adresses IPv4 sur la machine locale. Toutefois, si vous souhaitez uniquement écouter sur un sous-ensemble des adresses IP disponibles, vous devrez créer des prises distinctes.


3 commentaires

Non, iPaddress.any ne lie pas les objets de la prise à toutes les adresses IP si vous comptez simplement des adresses IP V6. La bonne façon est de créer deux objets de prise. Ensuite, on se lie à iPaddress.any, et l'autre se lie à iPaddress.ipv6any.


Bon point. Mon projet est toujours uniquement IPv4, donc IPv6 n'était même pas une considération lorsque j'ai écrit ma réponse.


Var Listener = Nouveau TCplistener (iPaddress.ipv6any, port); écoute.server.setsocktOption (socketoptionlevel.ipv6, socketoptionname.ipv6only, 0); écouter.start (); @Lexli Cela m'aidera à créer les deux (Dual Stack)?



2
votes

La bibliothèque MSDN semble contradicitoire concernant l'iPaddress.any. Le Doc de liaison

http://msdn.microsoft. com / fr-nous / bibliothèque / system.net.sockets.socket.bind.aspx

dit que l'adresse «la plus appropriée» est choisie, mais l'adresse iPaddress.any Doc

http://msdn.microsoft.com/ fr-US / bibliothèque / system.net.ipaddress.any.aaspx

dit qu'avec cette constante, la prise doit écouter une activité sur toutes les interfaces.

Cependant, je suis dit que c'est l'iPaddress.any Doc qui est correct.

(Ajout de cela comme une réponse puisque je n'ai pas assez de représentant pour quitter des commentaires).


0 commentaires

3
votes

J'ai travaillé dessus, iPaddress.any n'est pas la bonne façon, il liera une adresse IP appropriée. Dans mon cas, j'ai 2 Nic et je n'ai pas pu déranger le problème. Quand j'ai ajouté

System.Net.IPAddress ipAddress = IPAddress.Parse("xxx.xxx.xxx.xxx");
listener = new TcpListener(ipAddress, portNum);


0 commentaires

3
votes

Si vous souhaitez écouter toutes les adresses IPv4 et IPv6, utilisez ce code: xxx

ipv6any indique Windows à écouter sur la pile IPv6. Réglage de l'option Socket sur False Indique Windows de ne pas se limiter à la pile IPv6, mais plutôt à écouter sur la pile IPv4. La valeur par défaut est de n'écouter que sur la pile explicitement spécifiée.


2 commentaires

Wow, c'est joli ... Ummm .. Non évident;) Je suppose que cela ne prouve pas un moyen d'écouter de multiples IP de manière sélective.


Cela peut ne pas avoir d'importance pour la plupart des gens, mais cela n'est pris en charge que dans .NET 4 ou plus récent.