2012-09-04 38 views
1

我可以通過編寫連接端點:Socket.Connect結合本地IP拋出後10049

socket.Connect(endPoint); 

但是有些我連只接受來自特定IP地址的連接的設備。
所以要在服務器上使用,我想給用戶選擇本地端點的能力:

我給用戶填寫這樣的組合框:

var source = Dns.GetHostAddresses(Dns.GetHostName()) 
    .Where(ip => ip.AddressFamily == (rbIPv4.Checked 
     ? AddressFamily.InterNetwork 
     : AddressFamily.InterNetworkV6)).ToArray(); 
cbLocalIP.DataSource = source; 

rbIPv4rbIPv6是無線電控制。使用這兩個,我只顯示指定地址系列的地址。

  • 用戶選擇本地IP地址並輸入本地端口號。
  • 然後,他進入遠程IP地址和遠程端口號。

我得到的終點:

var localEP = new IPEndPoint((IPAddress)cbLocalIP.SelectedItem, localPort); 
var remoteEP = new IPEndPoint(remoteIP, remotePort); 

我創建一個套接字:

var socket = new Socket(remoteEP.AddressFamily, 
    SocketType.Stream, 
    ProtocolType.Tcp); 

我把它綁定到本地端點:

socket.Bind(localEP); 

我試着連接到遠程端點:

socket.Connect(remoteEP); 

它將引發與代碼SocketException:10049(AddressNotAvailable)。

  • 如果我不綁定套接字,Connect工程確定。
  • 如果我爲本地端點和綁定指定IPAddress.AnyConnect工程確定。
  • 如果我指定一個本地IP爲本地端點和綁定,Connect不起作用。

我在做什麼錯?

編輯:解決。我正在標記這一點,因爲我試圖連接同一臺機器上的偵聽器,並且(結果)綁定到相同的IP地址。

+0

即使您指定本地端口爲零,是否會發生這種情況? –

+0

@David:剛剛嘗試過,是的。 –

+1

你確定你綁定了一個本地*地址嗎?* – EJP

回答

1

如果我使用下面的一段代碼,它沒有任何問題就可以連接,所以試試你的IPAddresses,如果這樣做不起作用,那麼也許檢查你的防火牆設置。

var endpoint = new IPEndPoint(new IPAddress(new byte[] {10, 101, 10, 86}), 8000); 
    var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    socket.Bind(new IPEndPoint(new IPAddress(new byte[]{10,101,10,86}), 8001)); 
    socket.Connect(endpoint); 
+0

嘗試過,因爲沒有調用Listen方法,所以無法連接到它自己。我改變了最後一行連接遠程服務器,它仍然拋出「AddressNotAvailable」 –

+0

我只是試圖連接到遠程服務器的端口沒有聽,我得到同樣的錯誤,因爲你'AddressNotAvailable',所以我想你的代碼是正確的但是在您想要連接的服務器上存在問題。 – TimVK

+0

如果我先調用Connect而不先綁定,或者如果我綁定到IPAddress.Any而不是我的本地IP,則它連接時沒有問題。 –