2012-03-12 112 views
2

我正在尋找獲取剛剛創建的套接字的本地IP地址。我需要能夠支持具有多個NIC的服務器,並且能夠向請求客戶端反饋稍後直接IP地址的連接。我正在使用以下代碼:獲取套接字的本地IP地址

Socket rsock = null; 
rsock= new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); 
rsock.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0); 
rsock.Bind(new IPEndPoint(IPAddress.IPv6Any, port)); 
rsock.Listen((int)SocketOptionName.MaxConnections); 

在此之後,.LocalEndPoint踢出:[::]:PORT。

背景: 我之所以需要IP地址是由另一個客戶端輔助連接將需要返回到這個特定的服務器。這些服務器可能位於負載平衡器後面,用於初始服務器選擇,因此客戶端無法根據主機名解析IP地址。

+1

從客戶端接受連接後,您應該可以在新創建的Socket對象上使用LocalEndPoint來獲取所需的IP地址。 – 2012-03-12 16:19:44

+0

即使通過以下方式接受連接,.LocalEndPoint仍然說[::]:PORT。 'Socket nsock = rsock.Accept();' – 2012-03-12 16:36:09

+0

你說'nsock.LocalEndPoint'仍然報告綁定到'IPv6Any'?我不在IPv6友好的局域網中,所以我不能專門測試,但我知道這適用於IPv4。 – 2012-03-12 16:38:35

回答

1

由於您綁定了IPAddress.IPv6Any,所以在第一次I/O操作發生之前,端點信息將不可用。該documentation說:

如果讓系統分配的套接字的本地IP地址和 端口號,LocalEndPoint屬性將第一 I/O操作後設置。對於面向連接的協議,第一個I/O操作將是對ConnectAccept方法的調用。

所以,你的情況,你將不得不爲了獲得有意義的信息訪問LocalEndPoint之前調用Accept()

+0

即使通過以下接受連接,.LocalEndPoint仍然說[::]:PORT。 'socket nsock = rsock.Accept();' .LockKendPoint on nsock說:[:: 1]:PORT。 – 2012-03-12 16:37:39

+0

你是如何得到這些信息的?你只發布'LocalEndPoint.ToString()'還是你將返回的'EndPoint'轉換爲'IPEndPoint'並讀取它的'Address'屬性? – 2012-03-12 16:41:22

+0

正確,我投射到IPEndPoint並寫出地址: '((IPEndPoint)nsock.LocalEndPoint).Address.ToString()' – 2012-03-12 18:03:27