Question

Comment puis-je créer un client socket UDP dans la C ++ qu'il peut écouter sur un port qui est écouté par une autre application? En d'autres termes, comment puis-je appliquer le port de multiplexage en C ++?

Était-ce utile?

La solution

  

Je veux écouter sur un seul port

Vous pouvez le faire avec un renifleur. Il suffit d'ignorer les paquets de ports différents.

  

je pourrais avoir besoin d'arrêter d'envoyer quelques paquets particuliers, parce que mon programme enverra au lieu de la demande initiale

D'accord, ici, je vous suggère de se débarrasser des renifleurs, et utiliser un MITM technique.

Vous aurez besoin de compter sur une règle de pare-feu PREROUTING Dévier les paquets à un " proxy " application. En supposant UDP, Linux, iptables, et le " proxy " en cours d'exécution sur le même hôte, voici ce que le " proxy " doit vraiment faire:

1 Ajoutez la règle de pare-feu à Dévier les paquets (le faire, si vous préférez manuellement).

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
    -j REDIRECT --to-port <newport>

2. Bind et écouter sur <newport>.

3. Relais tout le trafic entre les 2 points de terminaison (client et destination d'origine). Si vous utilisez la " proxy " sur un hôte différent, utilisez getsockopt avec SO_ORIGINAL_DST pour récupérer l'adresse de destination d'origine.

Il peut sembler difficile, mais ... oui, c'est parce qu'il est un peu difficile :-) Consultez la documentation de votre pare-feu si mon hypothèse diverge.

Autres conseils

C'est paquet qui vient renifler comme tcpdump ou snoop, ouvrir une socket raw et tout tirer du fil et le filtre que vous avez besoin. Vous voudrez probablement utiliser libpcap pour rendre les choses un peu plus facile.

Sans privilèges d'administrateur ou utilisateur super vous aurez besoin de l'application cible aux ports ouverts avec SO_REUSEADDR et SO_REUSEPORT en fonction de la plate-forme. La mise en garde étant que vous ne pouvez recevoir des paquets de diffusion et de multidiffusion, les paquets unicast sont livrés à la première prise ouverte.

est pas multiplexage -. Ce terme est réservé à la gestion des E / S sur les canaux multiples dans le même processus et où des choses comme select(2) et poll(2) sont les plus utiles

Ce que vous demandez est multidiffusion . Voici l'exemple de base.

Notez que IP se réserve une gamme spéciale d'adresses (groupes appelés également) pour multicasting. Ceux-ci se mappés à des adresses Ethernet spéciales. L'auditeur (s) devrait JOIN le groupe de multidiffusion, alors que l'expéditeur n'a pas, il envoie comme d'habitude.

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top