C# 本地主机上套接字的奇怪行为
我有两个.net应用程序与端口5672上的套接字通信,一切正常。 在服务器端,我使用以下简单代码行打开连接:C# 本地主机上套接字的奇怪行为,c#,.net,c++,sockets,C#,.net,C++,Sockets,我有两个.net应用程序与端口5672上的套接字通信,一切正常。 在服务器端,我使用以下简单代码行打开连接: IPAddress localAddr = Dns.GetHostEntry("localhost").AddressList[0]; TcpListener socket = new TcpListener(localAddr, 5672); socket.Start(); 如果我尝试启动另一个服务器应用程序,它会失败,告诉我该端口已在使用中。 我也有同样的应用程序在C+
IPAddress localAddr = Dns.GetHostEntry("localhost").AddressList[0];
TcpListener socket = new TcpListener(localAddr, 5672);
socket.Start();
如果我尝试启动另一个服务器应用程序,它会失败,告诉我该端口已在使用中。我也有同样的应用程序在C++中编写(不是我)。 令我惊讶的是,我可以同时启动C++和.NET服务器。 最坏的情况是,我的C++客户端不能与我的.NET服务器通信(“连接拒绝”)。 错误) 为了了解我的问题,我使用以下命令列出了使用过的端口:
netstat -a
结果是:TCP 0.0.0.0:56720.0.0是
IPAddress。任何
,它都会绑定到任何可用的内容。Dns.GetHostEntry(“localhost”).AddressList[0]
绑定到IPv6环回地址,这就是为什么手动将其设置为IPv4环回时可以正常工作的原因
试试这个
IPHostEntry host;
host = Dns.GetHostEntry("localhost");
Console.WriteLine("GetHostEntry(\"LocalHost\") returns:");
foreach (IPAddress ip in host.AddressList)
{
Console.WriteLine(" {0}", ip);
}
Console.ReadLine();
对于Windows7,我得到以下结果
GetHostEntry("LocalHost") returns:
::1
127.0.0.1
当我运行以下代码时:
IPAddress localAddr = Dns.GetHostEntry("localhost").AddressList[0];
IPAddress localAddr2 = Dns.GetHostEntry("localhost").AddressList[1];
我得到了您在localAddr中显示的IPV6地址,以及在localAddr2中显示的“127.0.0.1”(并且在地址列表中没有更多的条目)。如果要使用IPv4,必须通过检查候选列表中每个IPAddress
中的AddressFamily
属性来找到并使用正确的地址
默认情况下,您无法侦听两个应用程序的同一端口/地址对。如果您想这样做(不确定为什么要这样做,因为这会使传入连接命中的服务器应用程序不确定),那么您可以通过在TcpListener
-注意,您必须在侦听器停止时执行此操作
<>因为你的C++应用程序直接使用'0.0.0.0 ',所以它的行为不同。它使用的是IPV4地址,因此不会与您的IPV6 C#TcpListener发生冲突
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
IPAddress ipAddress = ipHostInfo.AddressList[0];
foreach (IPAddress ip in ipHostInfo.AddressList)
{
AddressFamily af = ip.AddressFamily;
if (af == AddressFamily.InterNetwork)
{
ipAddress = ip;
break;
}
}
我正在使用WindowsVista。我现在不能确定,但我认为这个问题在XP中没有发生。[::1]是一个IPv6环回地址。也许你的C服务器绑定到IPv6地址,C++客户端尝试连接到IPv6地址?
IPHostEntry ipHostInfo = Dns.GetHostEntry(hostname);
IPAddress ipAddress = ipHostInfo.AddressList[0];
foreach (IPAddress ip in ipHostInfo.AddressList)
{
AddressFamily af = ip.AddressFamily;
if (af == AddressFamily.InterNetwork)
{
ipAddress = ip;
break;
}
}