我可以通過編寫連接端點: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;
rbIPv4
和rbIPv6
是無線電控制。使用這兩個,我只顯示指定地址系列的地址。
- 用戶選擇本地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.Any
,Connect
工程確定。 - 如果我指定一個本地IP爲本地端點和綁定,
Connect
不起作用。
我在做什麼錯?
編輯:解決。我正在標記這一點,因爲我試圖連接同一臺機器上的偵聽器,並且(結果)綁定到相同的IP地址。
即使您指定本地端口爲零,是否會發生這種情況? –
@David:剛剛嘗試過,是的。 –
你確定你綁定了一個本地*地址嗎?* – EJP