En utilisant netcat pour envoyer un paquet UDP sans liaison
Je suis en train d'utiliser netcat pour simuler un protocole NAT traversal.
J'ai un exemple qui est à l'écoute pour les paquets UDP sur le port 6666), comme suit:
nc-ul 6666
Dans une autre fenêtre de terminal, je suis en train d'envoyer périodiquement un paquet UDP de port 6666 (pour ouvrir la voie de retour sur mon routeur. ce serait un script qui se répète toutes les 20 secondes pour ré-ouvrir le port)
nc-u -p6666 mypinghost.com 4444
Le problème est netcat échoue sur ce ping call avec le message:
nc: échec de la liaison: Adresse déjà en cours d'utilisation
Ce qui implique que l'auditeur ayant lié au port 6666 est le blocage d'un autre processus à partir de l'envoi à partir de ce port, ou éventuellement que netcat est d'essayer de se lier à 6666 à écouter.
Est-ce juste la façon dont netcat est écrit, ou puis-je le chatouiller certains moyen de me faire envoyer un paquet sans liaison au port d'écouter?
OriginalL'auteur Jim Baldwin | 2012-07-08
Vous devez vous connecter pour publier un commentaire.
Écouter en UDP port 6666.
L'aide du protocole UDP port 6666 comme port source, envoyer à mypinghost:4444.
Qui seraient sur le deuxième
netcat
invocation, où 6666 est déjà en cours d'utilisation par la première.Correcte.
Et certainement. Vous lui avez dit de le faire, donc il l'a fait.
Ce que vous essayez de faire est impossible entre les deux processus dans le même hôte. Un seul processus peut utiliser un local spécifique de port UDP à un moment, sauf si vous utilisez
SO_REUSEADDRESS
, quinetcat
n'apparaît pas à mettre en œuvre.Que l'autre affiche a suggéré, la solution réside dans l'utilisation d'un seul processus.
Les messages doivent aller à tous les processus de réception à partir de ce port.
Par "processus de réception", tu veux dire ceux qui sont liés à elle, ou à ceux qui appellent
recvfrom
? Il se trouve que les datagrammes UDP semblent être fiable relevée par la plus récente du processus de liaison. Même si ce processus n'appelle jamaisrecvfrom
, il s'arrête toujours les autres de recevoir quoi que ce soit. Mais ce commentaire la discussion est arriver bondé, donc je vais vous poser une question distincte et comprennent mon code, sauf si vous pouvez penser à quelque chose de simple que je suis probablement manquant. 😉Il désigne les processus qui sont liés à ce port. Ils n'ont pas à être actuellement appel recv(), il y a une prise tampon de réception.
OriginalL'auteur user207421
Je ne crois pas que vous pouvez utiliser netcat. Je recommande la rédaction d'un simple script Python qui fait à la fois l'envoi et la réception de tâches dans un processus. De cette façon, vous pouvez maintenir ce port exclusivement et toujours accomplir les deux tâches.
OriginalL'auteur mhall