#c #windows #ipv6
#c #Windows #ipv6
Вопрос:
В чем разница между IPv6 и IPv4 на уровне программирования в Windows?
Можем ли мы просто изменить адрес IPv4 на IPV6 и сохранить все остальные программы такими же, будет ли это работать?
Комментарии:
1. разница в отношении кодирования
2. Асинхронное разрешение имен не работает с IPv6 (приходится использовать getnameinfo, что, честно говоря, является тяжелым испытанием). Кроме этого, теоретически все должно быть точно так же, если вы использовали «хорошую практику», поскольку все структуры долгое время были непрозрачными, поэтому вы не будете знать, изменилось ли что-то под капотом. Смотрите, как написать автономный код: kame.net/newsletter/19980604
3. Для Vista и более поздних версий вы можете установить параметр для сокета, чтобы использовать его как для целей IPv4, так и для IPv6. Взгляните на msdn.microsoft.com/en-us/library/ms738649 (v = против 85).aspx , чтобы помочь вам. Тщательное использование API и структур может позволить делать все это независимыми способами.
4. Вы не выбрали ни один из ответов. Если ни то, ни другое не соответствует вашим потребностям, не могли бы вы, пожалуйста, предоставить немного больше информации о том, что вы ищете?
5. @michael Ваш ответ намного ближе. Я хотел знать, где я должен внести изменения, чтобы заставить программу ipv4 работать с ipv6.
Ответ №1:
Это действительно зависит от того, что делает ваша программа.
Адрес IPV6 занимает 16 байт, а не четыре, используемые в IPV4. Представления строк также отличаются.
Создать сокет — это почти то же самое:
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Просто измените PF_INET на PF_INET6.
Подключение немного отличается:
nRet = connect(sock,
reinterpret_cast<SOCKADDR *>(amp;SockAddr),
sizeof(SockAddr));
В IPV4 SockAddr является структурой sockaddr_in, в IPV6 это sockaddr_in6.
Вы должны использовать что-то вроде getaddrinfo() для инициализации SockAddr, поскольку gethostbyname() не работает для IPV6.
bind(), listen() и accept () — это в большей степени одно и то же. Как только сокет установлен, чтение, запись и т.д. Не зависят от версии IP.
Если вы работаете на более высоком уровне (например, HTTP), ваша программа не должна нуждаться в каких-либо изменениях, но ей может потребоваться связать с другими библиотеками.
Ответ №2:
Спецификация IPv6 (RFC 3493) определяет некоторые новые методы API и структуры данных. Microsoft внедрила раннюю версию API (RFC 2553) в Windows, поэтому есть некоторые отличия. Эта ссылка описывает различия и описывает, какие API поддерживаются в какой версии Windows:
http://tdistler.com/2011/02/28/cross-platform-ipv6-socket-programming