获取套接字的本地IP地址
我正在寻找获取刚刚创建的套接字的本地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地址。
由于您绑定了IPAddress.IPv6Any
,所以在第一次I/O操作发生之前,端点信息将不可用。该documentation说:
如果让系统分配的套接字的本地IP地址和 端口号,
LocalEndPoint
属性将第一 I/O操作后设置。对于面向连接的协议,第一个I/O操作将是对Connect
或Accept
方法的调用。
所以,你的情况,你将不得不为了获得有意义的信息访问LocalEndPoint
之前调用Accept()
。
即使通过以下接受连接,.LocalEndPoint仍然说[::]:PORT。 'socket nsock = rsock.Accept();' .LockKendPoint on nsock说:[:: 1]:PORT。 – 2012-03-12 16:37:39
你是如何得到这些信息的?你只发布'LocalEndPoint.ToString()'还是你将返回的'EndPoint'转换为'IPEndPoint'并读取它的'Address'属性? – 2012-03-12 16:41:22
正确,我投射到IPEndPoint并写出地址: '((IPEndPoint)nsock.LocalEndPoint).Address.ToString()' – 2012-03-12 18:03:27
从客户端接受连接后,您应该可以在新创建的Socket对象上使用LocalEndPoint来获取所需的IP地址。 – 2012-03-12 16:19:44
即使通过以下方式接受连接,.LocalEndPoint仍然说[::]:PORT。 'Socket nsock = rsock.Accept();' – 2012-03-12 16:36:09
你说'nsock.LocalEndPoint'仍然报告绑定到'IPv6Any'?我不在IPv6友好的局域网中,所以我不能专门测试,但我知道这适用于IPv4。 – 2012-03-12 16:38:35