Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# 为什么只有当tcp请求是环回请求时才有效?_C#_Sockets_Tcp_Ip - Fatal编程技术网

C# 为什么只有当tcp请求是环回请求时才有效?

C# 为什么只有当tcp请求是环回请求时才有效?,c#,sockets,tcp,ip,C#,Sockets,Tcp,Ip,我在c#中遇到了这个问题,如果我发出环回(127.0.0.1)tcp请求,我可以连接到同一台PC上的服务器并发送数据,但如果我尝试从同一网络上的另一台设备进行连接,则无法工作。还尝试将客户端中的ip更改为网络ip(192.168.43.58),但即使它位于同一设备上,也仅当ip为环回ip时才起作用。还试图用我的智能手机作为路由器来创建一个新的网络,以防另一个有防火墙或类似的东西,但同样的问题 客户端(软件与服务器位于同一设备上,ip绝对正确,错误代码为:10061) 服务器 class Prog

我在c#中遇到了这个问题,如果我发出环回(127.0.0.1)tcp请求,我可以连接到同一台PC上的服务器并发送数据,但如果我尝试从同一网络上的另一台设备进行连接,则无法工作。还尝试将客户端中的ip更改为网络ip(192.168.43.58),但即使它位于同一设备上,也仅当ip为环回ip时才起作用。还试图用我的智能手机作为路由器来创建一个新的网络,以防另一个有防火墙或类似的东西,但同样的问题

客户端(软件与服务器位于同一设备上,ip绝对正确,错误代码为:10061)

服务器

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 ------------------------------------------");

            }
        }
    }
}
TL;博士

尝试将服务器托管在
0.0.0.0


说明:

服务器托管在环回IP上。如果根据您的操作系统选中
ipconfig
ifconfig
,您将看到分配给系统的多个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
然后

$ nc -v 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Connection refused
你可以试试上面的实验

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

$ 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
然后你可以连接到他们中的任何一个

$ nc -v 127.0.0.1 8080
nc: connectx to 127.0.0.1 port 8080 (tcp) failed: Connection refused
$ 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