无法从远程计算机连接

9

我有一个问题,但是在家无法检查它是否工作。 这是代码:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net.Security;

class Program
{
    private static IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    private static int port = 6000;
    private static string data = null;

    static void Main(string[] args)
    {
        Thread thread = new Thread(new ThreadStart(receiveThread));
        thread.Start();
        Console.ReadKey();
    }

    public static void receiveThread()
    {
        while (true)
        {
            TcpListener tcpListener = new TcpListener(ipAddress, port);
            tcpListener.Start();

            Console.WriteLine("Waiting for connection...");

            TcpClient tcpClient = tcpListener.AcceptTcpClient();

            Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint);

            while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead)))
            {
                NetworkStream networkStream = tcpClient.GetStream();
                StreamReader streamReader = new StreamReader(networkStream);

                data = streamReader.ReadLine();

                if(data != null)
                    Console.WriteLine("Received message: {0}", data);
            }
            Console.WriteLine("Dissconnected...\n");
            tcpListener.Stop();
        }
    }
}

我有一个简单的程序来连接并发送包含数据的字符串。在本地主机上运行良好,但是当我尝试与不同的计算机连接时出现问题。我甚至关闭了我的PC和路由器上的防火墙,并且也对我朋友的笔记本电脑这样做了。每次我尝试连接时,他的计算机都会拒绝连接。也许我做错了什么?当然,ipAddress目前是本地地址,因为它目前只能在本地工作。有什么建议吗?
4个回答

14

你需要将它设置为接受任何IP的连接,这里有一个可以实现这个功能的IPAddress overload函数:

System.Net.IPAddress.Any

使用它代替127.0.0.1,这将解决你的问题。


4

你正在监听 127.0.0.1 这个回送地址,它是一种特殊的地址,意思是“这台计算机”。这意味着你只会接受在与服务器运行的计算机相同的计算机上建立的连接。

你需要监听服务器的一个(或多个)真实 IP 地址。


那么我应该使用“我的互联网”IP来监听传入的连接吗? - Allek
您可以使用 IPAddress.Any 来监听您的所有接口,或者使用一个特定接口的地址来只监听该接口。如果您需要监听几个接口但不是全部,则需要每个地址一个监听器。 - Len Holgate

3
你的问题在于,在初始化TcpListener时明确设置IP地址将只允许它接受来自该地址的连接。因此,将本地地址127.0.0.1放入其中将只接受源自你的计算机的连接。
你想要使用的实现如下:
TcpListener tcpListener = new TcpListener(IPAddress.Any, port);

这将允许任何IP地址连接到指定端口上的程序。

1

我认为是你的计算机(服务器)拒绝连接,因为127.0.0.1是本地地址。

尝试使用这个简单的过载:

  TcpListener tcpListener = new TcpListener(port);

据说这个方法已被弃用。我使用本地主机IP,因为我正在我的计算机上侦听传入的连接。我认为它应该可以正常工作,或者我错了吗? - Allek
127.0.0.1只是你的PC自己看到的地址。你需要监听一个外部可见的IP,设置IPAddress。有任何问题请回答。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接