зачем связывать v6 с anyaddr с одним портом и устанавливать для v6only значение false, позже связывать v4 с anyaddr с тем же портом успешно? - PullRequest
0 голосов
/ 12 июня 2019

Я работаю с кодом в Windows, затем нахожу одну интересную проблему.

сначала создайте один сокет v6 с anyaddr и установите для ipv6 значение false на port1 и слушайте

второй создайте один сокет v4 сanyaddr на port1 успешно и слушают

, возвращают второй шаг и первый шаг, сначала создают сокет v4, затем сокет v6, это успешно

в Linux, сокет позже создает ошибку возврата связывания.поэтому мой вопрос: почему Windows выглядит так, и как этого избежать? (используйте пару сокетов v6only и v4?)

Я пробую Windows 7 и Windows 10 с кодом Python3 и C.все тесты, как на.

#in interpreter 1
import socket
v4 = socket.socket()
v4.bind(('0.0.0.0',8888))
v4.listen(15)

#in interpreter 2
import socket
v6 = socket.socket(socket.AF_INET6)
# IPPROTO_IPV6 on my system is 41
# IPV6_V6ONLY on my systen is 27
# i found thest two value in window c headers
# after set , i use getsockopt check, it sets successfully 
v6.setsockopt(41, 27, 0)
v6.bind(("::", 8888))

# netstat -n -a
# TCP    0.0.0.0:8888           0.0.0.0:0              LISTENING       6796
# TCP    0.0.0.0:8888           0.0.0.0:0              LISTENING       11612
# TCP    [::]:8888              [::]:0                 LISTENING       6796

Я ожидаю, что второй сокет не удастся связать, но он успешно связывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...