能否在已实例化并开启的出站System.Net.WebSockets.WebSocket获取端点信息?
ClientWebSocket实例的套接字信息获取可行性
对于已实例化并完全开启的出站System.Net.WebSockets.ClientWebSocket实例,无法通过公开API直接获取你提到的套接字信息,但可以通过反射访问内部底层套接字来实现,以下是对应项的具体说明:
套接字的本地IP与本地临时端口:
可以通过反射获取ClientWebSocket内部的底层Socket实例,再通过Socket.LocalEndPoint属性获取包含本地IP和端口的IPEndPoint对象。示例代码如下:using System.Reflection; using System.Net.WebSockets; using System.Net.Sockets; // 假设clientWebSocket是已连接的实例 FieldInfo socketField = typeof(ClientWebSocket).GetField("_socket", BindingFlags.NonPublic | BindingFlags.Instance); Socket underlyingSocket = socketField.GetValue(clientWebSocket) as Socket; if (underlyingSocket != null && underlyingSocket.Connected) { IPEndPoint localEndPoint = underlyingSocket.LocalEndPoint as IPEndPoint; string localIp = localEndPoint.Address.ToString(); int localPort = localEndPoint.Port; // 使用获取到的本地IP和端口 }注意:不同.NET版本的内部字段名可能有变化(例如部分版本可能是
m_Socket),反射方式存在版本兼容性风险。远程IP与远程端口:
同样通过反射获取底层Socket后,使用Socket.RemoteEndPoint属性即可获取远程IP和端口,即使连接时使用的是主机名,这里也会返回解析后的IP地址。示例代码如下:if (underlyingSocket != null && underlyingSocket.Connected) { IPEndPoint remoteEndPoint = underlyingSocket.RemoteEndPoint as IPEndPoint; string remoteIp = remoteEndPoint.Address.ToString(); int remotePort = remoteEndPoint.Port; // 使用获取到的远程IP和端口 }
提示:反射方式依赖.NET的内部实现细节,若需要更稳定的方案,建议在建立WebSocket连接前,通过自定义逻辑或使用底层Socket手动建立连接后再封装为WebSocket,但这会增加实现复杂度。
内容的提问来源于stack exchange,提问作者James Harcourt
相关产品推荐
相关产品推荐

