首页 > 解决方案 > 为什么 tcp 请求仅在它是环回请求时才有效?

问题描述

我在 C# 中有这个问题,如果我发出环回 (127.0.0.1) tcp 请求,我可以连接到同一台 PC 上的服务器并发送数据,但如果我尝试从同一网络上的另一台设备连接它不会不工作。还尝试在客户端将 IP 更改为网络一(192.168.43.58),但即使它在同一设备上,它也仅在 IP 是环回 IP 时才有效。还尝试使用我的智能手机作为路由器创建一个新网络,以防对方有一些防火墙或类似的东西但同样的问题。

客户端(软件和服务器在同一台设备上,ip绝对正确,错误码是:10061)

class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.Write("Messaggio? ");

            String messaggio = Console.ReadLine();

            string sRisultato = TCPUtils.getData(new TcpClient("192.168.43.58", 8888), messaggio);

            Console.WriteLine(sRisultato);

            Console.WriteLine();

        }
    }
}

服务器

class Program
{
    static void consoleLog(string msg)
    {
        msg = String.Format("[{0}] - {1}", DateTime.UtcNow.ToString(), msg);
        Console.WriteLine(msg);
    }

    static void Main(string[] args)
    {
        String host = "127.0.0.1";

        int portnum = 8888;

        TcpListener server = new TcpListener(IPAddress.Parse(host), portnum);

        consoleLog("------------------------------------------------");
        consoleLog("Server Accept client on port: " + portnum.ToString());
        consoleLog("------------------------------------------------");

        server.Start();

        while (true)
        {
            using (TcpClient client = server.AcceptTcpClient())
            {
                consoleLog("Connected! from " + client.Client.RemoteEndPoint.ToString());

                //stuff

                client.Close();

                consoleLog("Closed ------------------------------------------");

            }
        }
    }
}

标签: c#socketstcpip

解决方案


TL;博士

尝试将您的服务器托管在0.0.0.0.


解释:

服务器托管在环回 IP 上。如果您检查ipconfigifconfig根据您的操作系统,您会看到分配给您的系统的多个 IP。所有这些 IP 都属于它们在系统上的物理或虚拟接口。例如:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    inet 127.0.0.1 netmask 0xff000000
    ...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
    ....
vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255

它们都充当不同的门来接受流量。您可以在其他人不知道的情况下将流量发送到单个接口和从单个接口。

您正在(环回)接口上127.0.0.1或上运行您的服务器。lo0这意味着仅在lo0接口或127.0.0.1IP 地址上接受流量。如果您将服务器托管在 上192.168.0.2,那么您将只能访问该特定 IP 上的套接字。

$ http-server -a 192.168.0.2
Starting up http-server, serving ./
Available on:
  http://192.168.0.2:8080
Hit CTRL-C to stop the server

接着

$ nc -v 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Connection refused

你可以试试上面的实验。

您可以使用特定 IP 来侦听或告诉您的服务器侦听您拥有的所有接口0.0.0.0。这有着特殊的意义。

$ http-server -a 0.0.0.0
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8080
  http://192.168.0.2:8080
  http://192.168.56.1:8080
Hit CTRL-C to stop the server

然后您可以连接到其中的任何一个。


推荐阅读