【问题标题】:Why does my python TCP server need to bind to 0.0.0.0 and not localhost or it's IP address?为什么我的 python TCP 服务器需要绑定到 0.0.0.0 而不是 localhost 或它的 IP 地址?
【发布时间】:2016-11-10 10:39:08
【问题描述】:

我正在制作一个 Python TCP 服务器和一个 C# 客户端,我让它工作,但我不明白 为什么它工作,我希望有人能向我解释什么我迷路了。我正在尝试从我自己的网络中进行连接,因此不涉及防火墙。

在我的 python 脚本中,如果我绑定到 127.0.0.1localhost 我无法从我的 C# 脚本连接到它,所以我认为它可能需要是 DHCP 服务器提供的本地 IP 地址,所以我尝试绑定到 192.168.1.74(本地 IP 地址)。这仍然不起作用,但是如果我使用 0.0.0.0 作为我绑定的端口,我可以毫无问题地连接。

Python 服务器代码:

def startserver():
    global serversocket
    global server

    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    serversocket.bind(('0.0.0.0', 8089))
    #limit connections to 1 because we only expect C# code to talk to us
    serversocket.listen(1)
    print("Server Started, await connections...")

C# TCPclient 代码:

public string host = "192.168.1.74";
public int port = 8089;

public void ConnectSocket(string server, int port)
{
    TcpClient client = new TcpClient(server, port);

    byte[] data = System.Text.Encoding.ASCII.GetBytes("Hello World");

    NetworkStream stream = client.GetStream();

    stream.Write(data, 0, data.Length);

    print(string.Format("Sent: {0}", "Hellow World"));
    data = new byte[256];

    string responseData = string.Empty;

    int bytes = stream.Read(data, 0, data.Length);
    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
    print(string.Format("Received: {0}", responseData));

    stream.Close();
    client.Close();
}

为什么它只适用于0.0.0.0

编辑:绑定到0.0.0.0 并连接后,我现在可以绑定到它的IP 地址(192.168.1.74)并连接。虽然0.0.0.0 允许我通过localhost127.0.0.1 进行连接,但我想我会继续使用它。

【问题讨论】:

  • 0.0.0.0 是一个特殊值,表示“绑定到系统中的所有接口”(仅限 IPv4)--环回、以太网等。在 Python 中,您还可以传递空字符串而不是 @ 987654334@.
  • 我想一个更好的问题是,这是绑定 TCP 服务器的 正确 方式吗?还是应该尝试将其绑定到特定接口?该脚本还连接到通过 TCP 在本地运行的 NodeJS 服务器,因此 IMO 0.0.0.0 允许它绑定到所有接口是正确的,但要确保我当时做的事情正确。
  • IPv4 的 0.0.0.0 或 IPv6 的 ::0 通常用作通配符地址。如果您使用 localhost,则检查 DNS 结果以查看实际绑定到的 IP 地址(可能是 127.0.0.1)。使用此类地址时,您的客户端必须明确连接到该 IP 地址,例如 127.0.0.1,而不是 192.182.x.x。这是计算机网络的基本概念。
  • 您提到“我尝试绑定到 192.168.1.74”但在 C# 代码中 IP 地址不同,192.168.180.132
  • @J.J.Hakala 这是对复制粘贴所有内容的疏忽。在实际代码中是正确的。我现在可以通过绑定到 IP 地址来连接。但是直到我尝试了0.0.0.0,它才起作用,所以不知道我之前是否打错字了,还是其他原因。

标签: c# python sockets tcp


【解决方案1】:

127.0.0.1 和 localhost(基本相同)是“本地环回”地址。这意味着它们只能从您的计算机访问。任何其他计算机(即使在您自己的网络上)都无法连接到它们。这也可能取决于您的操作系统。

为了能够连接到您自己网络中的服务器,我认为您可以使用 0.0.0.0 或您的本地 IP 地址。您可以在 Windows 中使用ipconfig 找到它,在 Linux(我也认为在 MAC 中)使用 ifconfig。它很可能看起来像“192.168.a.b”,但这在一定程度上取决于您的网络配置。

【讨论】:

  • 只是要确认您的声明,即使用 0.0.0.0 允许我通过 localhost127.0.0.1192.168.1.74 进行连接,但如果我绑定到特定 IP,我 无论我从哪里连接,都使用相同的 IP。例如如果我在绑定到192.168.1.74 时在同一台机器上运行另一个客户端,我不能使用localhost,我必须使用相同的IP。
  • 是的,您确实需要使用服务器正在侦听的确切 IP。如果您想同时监听 localhost 和 192.168.1.74,则需要使用 0.0.0.0 或创建多个套接字。
  • localhost 可以是 127.0.0.1,但 DNS 设置可以将其设为其他值,::0 或其他值。所以不要做任何假设,总是检查 DNS 解析。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多