2009-10-02 56 views
7

我需要創建一個連接到服務器進程的套接字,但必須限制爲使用指定的本地適配器。默認行爲是使用任何可能的,但我需要確保給定的套接字只嘗試(例如)局域網連接,如果wifi和LAN都可用。設置套接字的本地端點

我正在使用C#和.NET 2.0。

乾杯

回答

12

Socket.Bind(EndPoint localEP)方法是你的朋友。有關詳細信息,請參閱MSDN上的here

要獲得所有本地適配器及其類型看System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()

+0

乾杯,就是這樣做的。 – Kazar 2009-10-02 15:24:42

+0

這應該是System.Net.NetworkInformation。NetworkInterface.GetAllNetworkInterfaces()。 – 2009-11-02 02:07:15

0

可以嘗試使用bind()函數? 也許這會做的伎倆。

在MSDN上我發現:

http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx

備註

需要上 未連接套接字之前隨後 調用監聽功能的綁定功能。它通常用於綁定到面向連接(流)或 無連接(數據報)套接字的 。 綁定函數也可用於將 綁定到原始套接字(套接字是通過調用套接字函數 創建的,套接字類型參數設置爲 SOCK_RAW)創建的套接字爲 。 綁定功能也 上的未連接的套接字 被用於後續調用 之前連接,ConnectEx,WSAConnect, WSAConnectByList,或WSAConnectByName 函數之前發送操作。

當有來電 到socket函數創建一個插座,它在一個 命名空間(地址族)的存在,但它沒有 分配給它的名字。 使用綁定 函數通過將 本地名稱分配給未命名的套接字來建立套接字的本地 關聯。

名稱由使用互聯網地址族三個部分組成,當 :本 地址族。主機地址。標識 應用程序的端口號 。

+0

bind()的是看正確的方法,但OP是要求C#。 – 2009-10-02 11:57:20

3

對於其他人的參考,我是因爲我用的是UdpClient類使用綁定有問題,並訪問其內部插槽(通過UdpClient.Client)無論我如何嘗試綁定,它都會拋出SocketException。我workaround依賴於創建和第一綁定的插座,然後將其分配到UdpClient實例:

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) 
{ 
    var endPoint = new IPEndPoint(ip, port); 
    socket.Bind(endPoint); 
    using (var client = new UdpClient() {Client = socket}) 
    { 
     var destinationIP = IPAddress.Broadcast; 
     client.Connect(destinationIP, port); 
     client.Send(bytes, bytes.Length); 
    } 
} 
相關問題