2010-03-03 19 views
38

Tôi đã cố gắng chạy một mã máy chủ socket Net trên máy tính Win7-64bit.
tôi tiếp tục nhận được lỗi sau:SocketException: địa chỉ không tương thích với giao thức được yêu cầu

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

Đoạn mã là:

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; 
}  

Đoạn mã trên hoạt động tốt trong sp3 Win-XP.

Tôi đã kiểm tra Error code details on MSDN nhưng điều đó không có ý nghĩa đối với tôi.

Bất kỳ ai cũng gặp phải sự cố tương tự? Bất kỳ giúp đỡ?

+0

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

Trả lời

83

Trên Windows Vista (và Windows 7), Dns .GetHostEntry cũng trả về địa chỉ IPv6. Trong trường hợp của bạn, địa chỉ IPv6 (:: 1) là lần đầu tiên trong danh sách.

Bạn không thể kết nối với địa chỉ IPv6 (InterNetworkV6) bằng ổ cắm IPv4 (InterNetwork).

Thay đổi mã của bạn để tạo ra các ổ cắm để sử dụng trong gia đình địa chỉ của địa chỉ IP đã chỉ định:

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

Note: Có một phím tắt để có được địa chỉ IP của localhost: Bạn chỉ có thể sử dụng IPAddress.Loopback (127.0.0.1) hoặc IPAddress.IPv6Loopback (:: 1).

+4

+1 ... hoặc bạn có thể sử dụng gia đình địa chỉ từ IPAddress, tất nhiên ... –

+1

IP v4 và v6 có rất nhiều điểm khác biệt. Kể từ Windows 7, bạn cần tìm hiểu cả hai vì chúng có tác động đến lập trình socket của bạn. –

+0

bất kỳ tài liệu/liên kết nào mà những khác biệt liên quan đến lập trình socket này được liệt kê? họ sẽ có ích – Amitd

2

Sửa C: \ Windows \ System32 \ drivers \ etc \ hosts và thêm dòng "127.0.0.1 localhost" (nếu nó vẫn ở đó, không bao gồm dấu ngoặc kép)

+3

Đây là giải pháp thay thế nhưng không được khuyến nghị. –

+0

@LexLi, bạn có thể giải thích tại sao nó không được khuyến cáo? –

+3

@NikitaSilverstruk, mã nguồn trong câu hỏi làm cho giả định không cần thiết rằng nó sẽ sử dụng IPv4 luôn. Câu trả lời của Ata giúp hoàn thành giả định này, và đó là lý do tại sao tôi nói nó chỉ là giải pháp thay thế. Cách tốt nhất là làm theo câu trả lời được chấp nhận. –

Các vấn đề liên quan