我正在制作一个Python TCP服务器和一个C#客户端,并且我能够正常工作,但我不明白为什么它正在工作,我希望有人能向我解释我失踪的事情。我试图从我自己的网络中进行连接,因此没有涉及防火墙。如果我绑定到127.0.0.1
或localhost
我不能从我的C#脚本连接到它,所以我想也许它需要是DHCP服务器给它的本地IP地址,所以我尝试绑定到192.168.1.74
(本地IP地址)。这仍然没有工作,然而如果我使用0.0.0.0
作为我绑定的端口,我可以连接没有问题。为什么我的python TCP服务器需要绑定到0.0.0.0而不是localhost或它的IP地址?
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中,您还可以传递一个空字符串而不是“”0.0。 0.0" '。 – SuperSaiyan
我想一个更好的问题是,这是绑定TCP服务器的正确方式吗?或者我应该尝试将其绑定到特定的界面?这个脚本也连接到一个通过TCP本地运行的NodeJS服务器,因此允许它绑定到所有接口的IMO'0.0.0.0'是正确的,但是要确保我正确地做了正确的事情。 –
对于IPv4或对于IPv6的:: 0,0.0.0.0通常用作通配符地址。如果您使用本地主机,请检查DNS结果以查看哪个IP地址(可能是127.0.0.1)实际上绑定到。当使用这样的地址时,客户端必须明确地连接到该IP地址,例如127.0.0.1,而不是192.182.x.x。这是一个计算机网络的基本概念。 –