- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试执行 Socket.Connect() 并且当我指定的 IP 地址为 ipv6 格式时,Socket.Connect() 失败并显示错误消息:
Address family not supported by protocol family .
使用了与请求的协议(protocol)不兼容的地址。所有套接字都使用关联的地址族(即 Internet 协议(protocol)的 AF_INET)和通用协议(protocol)类型(即 SOCK_STREAM)创建。如果在套接字调用中显式请求了不正确的协议(protocol),或者将错误族的地址用于套接字(例如,在 sendto 中),则会返回此错误。
但是,如果我取消注释以下代码段中的代码,则 ipv4 地址将用于连接,现在调用成功;请注意,hostadd.AddressList[0] 返回一个 ipv6 地址。
另请注意,我在启用了 ipv4 和 ipv6 的 Windows 7 64 位机器之间进行连接;
为什么使用 ipv6 地址连接会引发错误? Socket.Connect() 方法documents那 :
If IPv6 is enabled and the Connect(String, Int32) method is called to connect to a host that resolves to both IPv6 and IPv4 addresses, the connection to the IPv6 address will be attempted first before the IPv4 address. This may have the effect of delaying the time to establish the connection if the host is not listening on the IPv6 address.is not listening on the IPv6 address.
IPHostEntry hostadd = Dns.GetHostEntry(TimeServer);
IPAddress ip4IP = hostadd.AddressList[0];
//foreach (IPAddress ipAddress in hostadd.AddressList) {
// if (ipAddress.AddressFamily == AddressFamily.InterNetwork) {
// ip4IP = ipAddress;
// break;
// }
//}
IPEndPoint EPhost = new IPEndPoint(ip4IP, 123);
Socket pSocket = new Socket(
AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
pSocket.ReceiveTimeout = 2000;
pSocket.SendTimeout = 2000;
pSocket.Connect(EPhost);
最佳答案
看起来您在 Socket() 调用中指定了 IPv4。您是否尝试过使用 InterNetworkV6
而不是 InterNetwork
?根据我的经验,(至少对于 C 套接字)IPv6 套接字将同时支持 IPv4 和 IPv6 地址,但 IPv4 套接字将仅支持 IPv4。
关于c# - 带有 IPv6 地址的 Socket.Connect 引发 "Address Family Not supported"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786130/
我是一名优秀的程序员,十分优秀!