Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 本地主机上套接字的奇怪行为_C#_.net_C++_Sockets - Fatal编程技术网

C# 本地主机上套接字的奇怪行为

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+

我有两个.net应用程序与端口5672上的套接字通信,一切正常。 在服务器端,我使用以下简单代码行打开连接:

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;
            }
        }