【发布时间】:2016-11-10 10:39:08
【问题描述】:
我正在制作一个 Python TCP 服务器和一个 C# 客户端,我让它工作,但我不明白 为什么它工作,我希望有人能向我解释什么我迷路了。我正在尝试从我自己的网络中进行连接,因此不涉及防火墙。
在我的 python 脚本中,如果我绑定到 127.0.0.1 或 localhost 我无法从我的 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 允许我通过localhost 和127.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,它才起作用,所以不知道我之前是否打错字了,还是其他原因。