[英]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.