我有两个.net应用程序与端口5672上的套接字通信,并且everthing工作正常。 在服务器端,我用这个简单的代码行打开连接:
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:5672< ---(这是c ++服务器)
TCP [:: 1]:5672< ---(这是.net服务器)
根据我的C#代码,本地主机地址不能是0.0.0.0或127.0.0.1吗? 我的.net服务器上发生了什么? Waht是[:: 1]的含义?
注意:
如果我将我的代码更改为:
IPAddress localAddr = new IPAddress(new byte[]{0,0,0,0});
一切正常,我的C ++客户端与.net服务器进行通信。
答案 0 :(得分:2)
当我运行以下代码时:
IPAddress localAddr = Dns.GetHostEntry("localhost").AddressList[0];
IPAddress localAddr2 = Dns.GetHostEntry("localhost").AddressList[1];
我得到你在localAddr中显示的IPV6地址,以及localAddr2中的“127.0.0.1”(并且AddressList
中没有更多的条目)。如果您想使用IPv4,则必须查看候选人列表AddressFamily
中每个IPAddress
的{{1}}媒体资源,找到并使用正确的地址。
默认情况下,您无法从两个应用程序中侦听相同的端口/地址对。如果你想这样做(不知道为什么你会这样做,因为这会使服务器应用程序传入的连接达到非确定性),那么你可以通过在AddressList
上将ExclusiveAddrUse设置为false来实现这一点 - 但是请注意,当听众是TcpListener
- ped。
由于您的C ++应用程序直接使用“0.0.0.0”,因此其行为方式不同。它正在使用IPV4地址,因此与您的IPV6 C#Stop
不会产生冲突。
答案 1 :(得分:2)
我使用过这样的东西:
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;
}
}
答案 2 :(得分:1)
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();
对于Windows 7,我得到以下结果
GetHostEntry("LocalHost") returns:
::1
127.0.0.1
答案 3 :(得分:0)
0.0.0.0是IPAddress.Any
,它与任何可用的东西绑定。