Domanda

Come posso creare un socket UDP client in C++ in modo che possa essere in ascolto su una porta ascoltata da un'altra applicazione?In altre parole, come posso applicare il multiplexing delle porte in C++?

È stato utile?

Soluzione

Voglio ascoltare solo su una porta

Puoi farlo con uno sniffer.Ignora semplicemente i pacchetti provenienti da porte diverse.

Potrebbe essere necessario impedirgli di inviare alcuni pacchetti particolari, perché il mio programma li invierà al posto dell'applicazione originale

Ok, qui ti suggerisco di scartare gli sniffer e utilizzare a MIT tecnica.

Dovrai fare affidamento su una regola firewall PREROUTING per deviare i pacchetti a un "procura" applicazione.Supponendo che UDP, Linux, iptables e "procura" in esecuzione sullo stesso host, ecco cosa "procura"in realtà deve fare:

1. Aggiungi la regola firewall a deviare i pacchetti (fallo manualmente, se preferisci):

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

2. Lega e ascolta <newport>.

3. Inoltra tutto il traffico tra i 2 endpoint (client e destinazione originale).Se stai eseguendo il "procura" su un host diverso, utilizzare getsockopt con SO_ORIGINAL_DST per recuperare l'indirizzo di destinazione originale.

Potrebbe sembrare complicato, ma...Sì, è perché è un po 'complicato :-) Consulta la tua documentazione di firewall se la mia ipotesi diverge.

Altri suggerimenti

Questo è solo packet sniffing come tcpdump o snoop, aprire una presa e trazione greggio tutto dal filo e filtro come desiderato. Probabilmente si desidera utilizzare libpcap per rendere le cose un po 'più facile.

Senza i privilegi di amministratore o super-utente sarà necessario l'applicazione di destinazione ai porti aperti con SO_REUSEADDR e SO_REUSEPORT come appropriato per la piattaforma. L'avvertimento di essere si può solo ricevere pacchetti broadcast e multicast, pacchetti unicast vengono consegnati al primo socket aperto.

Questa è non multiplexing -. Questo termine è riservato per la gestione di I / O su più canali nello stesso processo e dove le cose come select(2) e poll(2) sono più utili

Quello che chiediamo è multicast . Ecco è l'esempio di base.

Si noti che IP si riserva una speciale gamma di indirizzi (note anche come gruppi) per il multicasting. Questi vengono mappati a indirizzi speciali ethernet. L'ascoltatore (s) dovrebbe unirsi del gruppo multicast, mentre il mittente non deve, li invia come al solito.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top