2010-03-03 16 views
38

Win7-64bit makinesinde bir .Net yuvası sunucu kodu çalıştırmaya çalışıyordum.
aşağıdaki hatayı almaya devam:SocketException: adres istenen iletişim kuralıyla uyumsuz

System.Net.Sockets.SocketException: An address incompatible with the requested protocol was used.
Error Code: 10047

kod parçacığı geçerli:

IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; 
IPEndPoint ip = new IPEndPoint(ipAddress, 9989); 
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); 
try 
{ 
    serverSocket.Bind(ip); 
    serverSocket.Listen(10); 
    serverSocket.BeginAccept(new AsyncCallback(AcceptConn), serverSocket);   
} 
catch (SocketException excep) 
{ 
    Log("Native code:"+excep.NativeErrorCode); 
// throw; 
}  

Yukarıdaki kod Win-XP SP3, gayet iyi çalışıyor.

Error code details on MSDN'u kontrol ettim, ancak bu bana mantıklı gelmiyor.

Herkes benzer sorunlarla karşılaştı? Herhangi bir yardım?

+0

http://stackoverflow.com/a/36150831/2459296 – Salim

cevap

83

.GetHostEntry ayrıca IPv6 adreslerini de döndürür. Durumunuzda, IPv6 adresi (:: 1) listede ilk sıradadır.

IPv4 (InterNetworkV6) adresine bir IPv4 (InterNetwork) soketi ile bağlanamazsınız.

belirtilen IP adresinin adres ailesini kullanmaya yuva oluşturmak için kodunuzu değiştirin:

Socket serverSocket = 
    new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
         ↑ 

Not: localhost IP adresini elde etmek için bir kestirme var: Sadece kullanabilirsiniz IPAddress.Loopback (127.0.0.1) veya IPAddress.IPv6Loopback (:: 1).

+4

+1 ... veya adres ailesini IPAddress'den kullanabilirsiniz, tabii ki ... –

+1

IP v4 ve v6 çok fazla farklılığa sahiptir. Windows 7'den beri, hem soket programlamanız üzerinde etkisi olduğu için öğrenmeniz gerekir. –

+0

Soket programlamaya ilişkin bu farklılıkların listelendiği herhangi bir belge/link listeleniyor mu? – Amitd

2

Düzenleme C: \ Windows \ System32 \ drivers \ etc \ hosts ve çizgi "127.0.0.1 localhost" add (eğer onun değil orada hariç tırnak), Windows Vista (ve Windows 7), DNS

+3

Bu bir geçici çözümdür, ancak önerilmez. –

+0

@LexLi, neden önerilmediğini detaylandırır mısınız? –

+3

@NikitaSilverstruk, sorunun kaynak kodu, IPv4'ü her zaman kullanacağına dair gereksiz bir varsayım getiriyor. Ata'nın cevabı bu varsayımı yerine getirmeye yardımcı oluyor ve bu yüzden bunun sadece bir çözüm olduğunu söylüyorum. En iyi yol, kabul edilen cevabı takip etmektir. –