J'essaie de faire un Socket.Connect() et lorsque l'adresse IP que je spécifie est au format ipv6, le Socket.Connect() échoue avec le message d'erreur:Socket.Connect avec une adresse IPv6 lance une erreur "Adresse famille non prise en charge"
Address family not supported by protocol family. Une adresse incompatible avec le protocole demandé a été utilisée. Toutes les sockets sont créées avec une famille d'adresses associée (AF_INET pour les protocoles Internet) et un type de protocole générique (SOCK_STREAM). Cette erreur est renvoyée si un protocole incorrect est explicitement demandé dans l'appel de socket ou si une adresse de la mauvaise famille est utilisée pour un socket, par exemple dans sendto.
Toutefois, si je ne commente pas le code dans l'extrait ci-dessous, l'adresse IPv4 sera utilisée pour se connecter et l'appel réussit; Notez que hostadd.AddressList [0] renvoie une adresse ipv6. Notez également que je me connecte entre les ordinateurs Windows 7 64 bits qui ont tous deux ipv4 et ipv6 activé; Pourquoi la connexion utilisant une adresse ipv6 renvoie-t-elle l'erreur? La méthode Socket.connect() documents que:
Si IPv6 est activé et la Connect (String, Int32) est appelé à se connecter à un hôte qui résout à la fois les adresses IPv6 et IPv4 , la connexion à l'adresse IPv6 sera tenté d'abord avant l'adresse IPv4. Cela peut avoir l'effet de retarder l'heure à établir la connexion si l'hôte n'écoute pas sur l'adresse IPv6. N'écoute pas sur l'adresse IPv6.
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);