簡體   English   中英

使用了與請求的協議不兼容的地址

[英]An address incompatible with the requested protocol was used

我在Visual Studio 2012中運行與網絡相關的Windows項目,並且操作系統為Windows7。出現以下錯誤:

使用了與請求的協議不兼容的地址

我的代碼是:

public DestCode()
{
   IPHostEntry ipEntry = Dns.GetHostEntry(Environment.MachineName);
   IPAddress IpAddr = ipEntry.AddressList[0];
   ipEnd = new IPEndPoint(IpAddr, 5001);
   sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
   sock.Bind(ipEnd);
}

ipEntry.AddressList[0]絕對不是正確的選擇。 一台機器可能配置了幾個IP地址,其中一些是自動配置的,通常不會被應用程序使用。 可能有IPv4地址,IPv6地址,鏈接作用域地址,站點作用域地址,然后是某個地方,最后可能是全局作用域地址(可以在公共Internet上使用的地址)。

例如,這是我當前的計算機具有的功能:

在此處輸入圖片說明

您會注意到,該列表似乎更喜歡對IPv6地址進行排序以降低索引。 您的計算機上很可能發生了同樣的情況。

您可以使用表示為IPv4的AddressFamily.InterNetwork創建套接字,但是隨后綁定的地址很可能是IPv6:

new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);

如果要使代碼“工作”時所做的更改很少,那么請提供創建套接字時要綁定到的地址的地址族,如下所示:

new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.IP)
sock.Bind(ipEnd);

但是,使用ipEntry.AddressList[0]可能是錯誤的做法,因為您永遠不會知道將獲得哪個地址。 那么,您如何獲得地址? 好吧,這取決於你。 如果您只想回送進行測試或進行某些IPC,請使用127.0.0.1 ; 如果要在任何地址上發送和接收,請綁定到0.0.0.0 ,這意味着在此特定上下文中為“任意”地址。 否則,通常需要從用戶那里進行這種配置,尤其是在用戶知道他希望其監聽的界面的情況下。 就我而言,沒有一個好的界面可以自動選擇,我當然希望您問我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM