2015-06-29 9 views
9

Domanda breve e semplice: Sono nuovo a boost::asio e mi chiedevo se è possibile creare un ascolto tcp::acceptor per entrambe, le connessioni IPv4 e IPv6 insieme. I tutorial sulla homepage di spinta mostrano qualcosa di simile:Accettare insieme IPv4 e IPv6 in boost :: asio

_acceptor = new tcp::acceptor(_ioService, tcp::endpoint(tcp::v4(), 3456)); 

in cui l'endpoint è sempre specificato con un protocollo specifico. Non è possibile ascoltare IPv4 e IPv6 sulla stessa porta contemporaneamente?

risposta

12

Se si crea un accettore IPv6, accetterà entrambe le connessioni IPv4 e IPv6 se l'opzione socket IPV6_V6ONLY è deselezionata. Gli indirizzi IPv4 verranno presentati come indirizzi IPv6, nel formato IPv4-mapped.

I problemi si verificano principalmente intorno se IPV6_V6ONLY è disponibile o quale è il valore predefinito (attivato o disattivato). Quindi trovo che sia meglio impostarlo esplicitamente su ciò che desideri.

Anche Windows XP non supporta affatto l'opzione.

Quindi, se si desidera essere compatibili tra i sistemi, si consiglia di creare due socket, uno per v4 e uno per l'impostazione v6 IPV6_V6ONLY.

+0

Questo è esattamente quello che stavo cercando. Ho davvero bisogno di una certa compatibilità tra i sistemi, soprattutto Windows 7 o superiore e Linux, mentre ho visto che IPV6_V6ONLY è supportato lì dal kernel 2.6. XP/Server2003 non dovrebbe essere un problema, ma sarebbe bello controllare in qualche modo tutte le opzioni di socket disponibili in fase di esecuzione - purtroppo non ho trovato un modo per farlo, è tutto quello che il preprocessore definisce per quanto posso dire (o provo a impostare l'opzione e verificare un errore di associazione). Ad ogni modo, questo risponde alla mia domanda. – PuerNoctis