L'envoi et la réception de paquets UDP entre deux programmes sur le même ordinateur
Est-il possible d'obtenir deux programmes distincts pour communiquer sur le même ordinateur (aller seulement) sur UDP via localhost/127... en partageant le même port #?
Nous travaillons sur un projet d'étudiants à qui nous devons envoyer des paquets UDP contenant certains de télémétrie entre deux ordinateurs. Le programme qui génère ces paquets sont propriétaires, mais je suis en train de travailler sur le récepteur programme moi-même avec C# à l'aide de Système.Net.Les Sockets.UdpClient et Système.Net.L'ipendpoint.
Cela fonctionne bien lors de nos réunions du groupe lorsque nous avons plusieurs ordinateurs connectés sur lequel on peut exécuter les deux programmes séparément. Mais il n'est pas très utile quand je suis à la maison et essayer d'étendre sur la télémétrie programme de traitement que je n'ai qu'un seul ordinateur (j'ai besoin d'une alimentation pour l'essai d'un programme de traitement). Je ne peux pas installer le logiciel sur les ordinateurs de l'école soit.
Lorsque j'essaie d'exécuter les deux programmes sur mon ordinateur en même temps (à partir de mon programme), je reçois une exception socketexception dire qu'une seule utilisation de chaque port est normalement permis. Ce qui m'amène à croire qu'il y doit y avoir un moyen de partager le port (même si il est logique qu'un seul programme peut utiliser le port sur un ordinateur à la fois, je n'ai pas de difficulté de l'exécution de plusieurs navigateurs internet en même temps (et je suppose qu'ils utilisent le port 80 pour http)).
REMONTEZ de l'ÉDITION:
sipwiz avait raison, et grâce à Kalmi pour le pointeur vers UdpClient.Client.Bind().
À l'époque, cependant, on envisage d'utiliser un autre programme qui génère des paquets similaires, et avec qui nous pouvons partager port avec sur le même ordinateur à l'aide de mon premier (bien que naïve) approche avec le client UDP de liaison dans le ctor.
Désolé d'avoir à enlever votre réponse, sysrqb.
- Une façon que vous pourriez potentiellement obtenir autour de cette si aucune autre solution est de créer une machine virtuelle et d'avoir la machine virtuelle communiquer avec votre bureau principal.
- Les navigateurs Internet ne partagent pas les ports. Ils utilisent un port aléatoire(attribué par le système d'exploitation) pour se connecter au serveur. Le client et le port du serveur n'ont pas à être les mêmes. Utiliser netstat pour voir ce que les ports de votre navigateur utilisez.
Vous devez vous connecter pour publier un commentaire.
Je ne m'attendais pas que ce soit possible, mais.. bien.. sipwiz a droite.
Cela peut être fait très facilement. (S'il vous plaît voter sipwiz de réponse jusqu'!)
Vous pouvez lier à un port plusieurs fois à l'aide de la ReuseAddress option de socket.
Vous aurez besoin de mettre la même option sur l'UDP socket serveur en tant que bien.
Voici le code complet de la réponse en Tarnay Kálmán et sipwiz:
Le code du serveur:
Le code de client:
Vous pourriez être en mesure de mettre plusieurs adresses IP sur votre carte réseau, ou de bouclage, et de lier le serveur et le client pour des adresses IP différentes?
Ou encore l'approche de machine Virtuelle sera certainement le travail.
Un seul programme peut lier pour un port à la fois. Plusieurs programmes peuvent connecter vers un port sur un autre système, mais le port local de vos différents navigateurs web ont liés eux-mêmes à qui est attribué de façon aléatoire.
Sauf si vous voulez faire un peu moche de communication inter-processus ou reniflage de paquets, il n'y a pas moyen d'avoir plusieurs programmes liés à un port.
Mon conseil: ne passez pas le numéro de port dans le UdpClient constructeur. À partir de la la documentation, (un peu clairsemé, je sais...), il semble comme si vous le faites, le UdpClient va essayer de lier à ce port (qui, comme sysrqb mentionné, n'est pas autorisé). (Si vous ne le faites pas, je crois que le UdpClient sera à l'écoute sur un port aléatoire pour toutes les réponses. Vous pouvez également choisir un port que vous savez être utilisés.)
Lorsque vous appelez Connect (), vous devez passer dans le numéro de port du serveur est écoute sur.
lier les deux programmes,c'est à dire, l'émetteur et le récepteur sur le même port sur le localhost.dats la réponse la plus simple.
Même le changement de votre code afin que je puisse passer dans une adresse IP j'obtient le même message d'erreur, il semble que vous ne pouvez pas lier le même port et un seul port peut être utilisé
voici un exemple de code que j'ai utilisé votre exemple et de le modifier à capter mon ip de ma machine locale..
IPAddress ipAddress = Dns.Résoudre(Dns.GetHostName()).AddressList[0];
L'ipendpoint ipLocalEndPoint = new l'ipendpoint(ipAddress, 11000);
cela permettra de produire de l'exception sur la méthode Bind ().. désolé.