Nếu bạn thực sự muốn có một giải pháp mở rộng, bạn có thể mở rộng giải pháp của bạn để sử dụng getaddrinfo()
:
import socket
l = socket.getaddrinfo(None, "", 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
for i in l: print i
Điều này cho phép
(2, 1, 6, '', ('0.0.0.0', 0))
(10, 1, 6, '', ('::', 0, 0, 0))
Đây là những thông số bạn nên tạo một ổ cắm với :
s = socket.socket(i[0], i[1], i[2])
if i[0] == AF_INET6: s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
s.bind(i[4])
Bây giờ bạn có nhiều ổ cắm khi bạn có các giao thức và bạn có thể sử dụng chúng. (Than ôi, IPV6_V6ONLY
không hoạt động dưới các phiên bản Windows cũ hơn ...)
Nếu bạn có một tên máy chủ cho/IP để ràng buộc vào, làm
l = socket.getaddrinfo("mylocalIP", None, 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
và nó sẽ chọn đúng địa chỉ/gia đình giao thức dành cho bạn:
>>> socket.getaddrinfo("::1", None, 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
[(10, 1, 6, '', ('::1', 0, 0, 0))]
>>> socket.getaddrinfo("127.0.0.1", None, 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
[(2, 1, 6, '', ('127.0.0.1', 0))]
>>> socket.getaddrinfo("localhost", None, 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
[(10, 1, 6, '', ('::1', 0, 0, 0)), (2, 1, 6, '', ('127.0.0.1', 0))]
>>> socket.getaddrinfo("192.168.1.32", None, 0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
[(2, 1, 6, '', ('192.168.1.32', 0))]
, vv
2
vs 10
là AF_INET
vs AF_INET6
; socket.AI_PASSIVE
có nghĩa là bạn cần địa chỉ này cho bind()
ing.