是否可能有一个进程有两个套接字,一个使用 ,AF_INET
一个使用AF_INET6
系列,同时两者都绑定到相同的端口号,例如20000
?
如果 IPv6 套接字setsockopt
仅支持 IPv6,内核是否会根据 IP 协议版本正确地将数据包定向到正确的套接字?
答案1
是的,这是可能的(可能会出现复杂情况,具体取决于高级语言以及它让您选择此类细节的能力)。
#!/usr/bin/env expect
set port 1234
proc v4 {fh caddr cport} { puts $fh v4; close $fh }
proc v6 {fh caddr cport} { puts $fh v6; close $fh }
socket -myaddr 127.0.0.1 -server [list v4] $port
socket -myaddr ::1 -server [list v6] $port
vwait godot
随着运行:
% lsof -i -nP | grep 1234
expect 96688 jhqdoe 10u IPv4 0xf7... 0t0 TCP 127.0.0.1:1234 (LISTEN)
expect 96688 jhqdoe 11u IPv6 0xf7... 0t0 TCP [::1]:1234 (LISTEN)
% nc 127.0.0.1 1234
v4
% nc ::1 1234
v6