gpt4 book ai didi

c# - 带有 IPv6 地址的 Socket.Connect 引发 "Address Family Not supported"错误

转载 作者:行者123 更新时间:2023-12-03 12:01:36 24 4
gpt4 key购买 nike

我正在尝试执行 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com