为什么LocalEndpoint = 0.0.0.0此时?根据文档,它应该是系统选择的适当地址。注意:这仅在某些机器上出现。大多数机器都会返回我期望的IP地址。这是.NET中的错误吗?
using (Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp))
{
Console.WriteLine("Connecting");
s.Connect("www.google.com", 80);
Console.WriteLine("Connected OK");
s.Send(new byte[] { 1 });
Console.WriteLine("Sent Byte OK");
Console.WriteLine("Local EndPoint = " +
s.LocalEndPoint.ToString());
}
//Local EndPoint = 0.0.0.0
我也尝试过做
s.Bind(new IPEndPoint(IPAddress.Any, 0));
创建套接字后直接没有区别。 “问题”机器始终返回0.0.0.0。
这是ipconfig / all
的结果Windows IP Configuration
Host Name . . . . . . . . . . . . : andrepc
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Unknown
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
以太网适配器本地连接2:
Media State . . . . . . . . . . . : Media disconnected
Description . . . . . . . . . . . : VIA VT6105 Rhine Fast Ethernet Adapter
Physical Address. . . . . . . . . : 00-30-18-67-A0-EB
以太网适配器本地连接:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Realtek RTL8029 PCI Ethernet Adapter
Physical Address. . . . . . . . . : 00-C0-DF-E7-C9-5D
Dhcp Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IP Address. . . . . . . . . . . . : 10.0.0.6
Subnet Mask . . . . . . . . . . . : 255.0.0.0
Default Gateway . . . . . . . . . : 10.0.0.2
DHCP Server . . . . . . . . . . . : 10.0.0.2
DNS Servers . . . . . . . . . . . : 10.0.0.2
Lease Obtained. . . . . . . . . . : Wednesday, May 20, 2009 5:39:06 PM
Lease Expires . . . . . . . . . . : Thursday, May 21, 2009 5:39:06 PM
10.0.0.6这将是我期望的结果。
答案 0 :(得分:2)
我认为你正在获得套接字上本地端点的正确结果,从我测试的,这基本上是默认的IP,因为“0.0.0.0”基本上告诉套接字听取所有网络适配器,如果你听那个插座。 IPEndpoint.Any属性基本上等于ip为“0.0.0.0”。
我认为您使用netstat获取本地IP,因为您正在使用该方法解析它。
答案 1 :(得分:1)
好的决定使用解决方法。经过测试和工作。任何人都可以想到为什么这样做可能无法提供准确的IP /端口?
static void Main(string[] args)
{
try
{
using (Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp))
{
Console.WriteLine("Connecting");
s.Connect("www.google.com", 80);
Console.WriteLine("Connected OK");
s.Send(new byte[] { 1 });
Console.WriteLine("Sent Byte OK");
Console.WriteLine("Local EndPoint Netstat = " +
GetLocalEndPoint(s));
Console.WriteLine("Local EndPoint LocalEndPoint = " +
((IPEndPoint)s.LocalEndPoint).ToString());
}
}
catch (Exception e)
{
Console.WriteLine("Exception - " + e.Message);
}
}
static string GetLocalEndPoint(Socket s)
{
Console.WriteLine(DateTime.Now.TimeOfDay.ToString() +
" Find IP LocalEndPoint");
IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] connections =
properties.GetActiveTcpConnections();
IPEndPoint remoteEP = (IPEndPoint)s.RemoteEndPoint;
foreach (TcpConnectionInformation netstat in connections)
{
if (remoteEP.ToString() == netstat.RemoteEndPoint.ToString())
{
Console.WriteLine(DateTime.Now.TimeOfDay.ToString() +
" Find IP LocalEndPoint OK");
//Use the "Netstat" IP but the socket.LocalEndPoint port
return new IPEndPoint(netstat.LocalEndPoint.Address,
((IPEndPoint)s.LocalEndPoint).Port).ToString();
}
}
return string.Empty;
}
Connecting
Connected OK
Sent Byte OK
09:57:38.5312500 Find IP LocalEndPoint
09:57:38.5312500 Find IP LocalEndPoint OK
Local EndPoint Netstat = 10.0.0.6:1711
Local EndPoint LocalEndPoint = 0.0.0.0:1711
答案 2 :(得分:0)
尝试使用((IPEndPoint)s.LocalEndPoint).ToString());
答案 3 :(得分:0)
我们现在进行了测试,当“ipconfig -all”windows命令行命令在第一个位置返回时,返回IP 0.0.0.0 已断开连接。
如果你“关闭/停止”(我不知道英文中究竟是什么单词,我没有英文Windows)适配器,你会看到它返回正确的IP。