.NET 4 新的 TCP 客户端无法连接:无法建立连接,因为目标机器主动拒绝它

Posted

技术标签:

【中文标题】.NET 4 新的 TCP 客户端无法连接:无法建立连接,因为目标机器主动拒绝它【英文标题】:.NET 4 new TCP client fails to connect: No connection could be made because the target machine actively refused it 【发布时间】:2011-11-22 23:17:57 【问题描述】:

我在 win7 和 xp 中都遇到了 .NET 4 Sockets (TcpClient) 的简单问题。

我得到错误:

由于目标机器主动拒绝,无法建立连接

这似乎不是防火墙问题,因为客户端和服务器程序都在同一台计算机上,而且我没有启用任何本地防火墙。

我编写了服务器和客户端(他们在端口 80 上进行通信(我也尝试过其他端口,例如 31000)。我的机器上的端口 80 上没有运行其他任何东西。

客户端代码为:

    public void makeConnection()
    
        string server = ClientStatus.myself.ServerName;
        port = 80;
        ClientStatus.myself.BytesSent = 0.ToString();
        client = new TcpClient(server, port);
        ClientStatus.myself.Connected = "connected";
        stream = client.GetStream();
        bytes = new Byte[1024];
    

我确认服务器和端口是我所期望的。错误发生在 new TcpClient(server, port) 上,它在错误发生之前旋转了大约 4 秒。我还尝试使用 IP 地址 (127.0.0.1) 而不是“myhostname.domain.com”作为服务器(创建客户端套接字的替代方法),但它也失败了。

这是我为服务器编写的代码:

命名空间 SocketListener 类数据监听器 public static DataListener 我自己; TcpListener 服务器 = null; 字节[] 字节; Int32 端口; IP地址本地地址; 主窗口 w;

    public DataListener(MainWindow caller)
    
        DataListener.myself = this;
        w = caller;
        Status.myself.Connected = "starting";
        port = 80;
        localAddr = IPAddress.Parse("127.0.0.1");
        server = new TcpListener(localAddr, port); 
        bytes = new Byte[1024];
        server.Start();
    

    public void acceptLoop()
    
        TcpClient client;
        while (true)
        
            // Perform a blocking call to accept requests.
            Status.myself.Connected = "waiting";
            if (server.Pending())
            
                client = server.AcceptTcpClient();
                Status.myself.Connected = "true";
                Status.myself.BytesReceived = 0.ToString();
                NetworkStream stream = client.GetStream();
                dataLoop(stream);
                client.Close();
            
            else
            
                Thread.Sleep(100);
                return;
            
            // Shutdown and end connection
            Status.myself.Connected = "false";
        
    

    public void dataLoop(NetworkStream stream)
    
        int count = 0;
        int i;
        Status.myself.ByteRate = "0.0";
        Stopwatch watch = new Stopwatch();
        watch.Start();
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        
            count += i;
            Status.myself.BytesReceived = count.ToString();
        
        watch.Stop();
        double rate = count / (watch.ElapsedMilliseconds / 1000);
        rate = rate / (1024 * 1024);
        Status.myself.ByteRate = rate.ToString();
    

    public void shutdown()
    
        server.Stop();
    


【问题讨论】:

检查这个[问题][1] [1]:***.com/questions/2972600/… 再试一次,在服务端使用IPAddress.Any,在客户端使用IpAddress.Loopback 【参考方案1】:

我有win7盒子。因此接受传入连接被阻止(甚至是本地连接)。答案是:

运行

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\user

见:

netsh http add urlacl : add reservation for a group

【讨论】:

以上是关于.NET 4 新的 TCP 客户端无法连接:无法建立连接,因为目标机器主动拒绝它的主要内容,如果未能解决你的问题,请参考以下文章

centos允许tcp无法连接

linux系统如何连接到大学校园网?

TCP 错误代码 10061:无法连接到 net.tcp://。连接尝试持续了 00:00:01.0156241 的时间跨度

升级到 Windows 10 后 net.tcp 无法正常工作

TCP 的优化

WebSocket消息推送