在localhost上使用套接字的奇怪行为

时间:2010-10-19 17:46:09

标签: c# .net c++ sockets

我有两个.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服务器进行通信。

4 个答案:

答案 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,它与任何可用的东西绑定。