2016-07-07 181 views
0

我正在制作一个Python TCP服务器和一个C#客户端,并且我能够正常工作,但我不明白为什么它正在工作,我希望有人能向我解释我失踪的事情。我试图从我自己的网络中进行连接,因此没有涉及防火墙。如果我绑定到127.0.0.1localhost我不能从我的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允许我通过localhost127.0.0.1连接,所以我想我会继续使用它。

+1

'0.0.0.0'是一个特殊的值,表示“绑定到系统中的所有接口”(仅IPv4) - 回环,以太网等。在Python中,您还可以传递一个空字符串而不是“”0.0。 0.0" '。 – SuperSaiyan

+0

我想一个更好的问题是,这是绑定TCP服务器的正确方式吗?或者我应该尝试将其绑定到特定的界面?这个脚本也连接到一个通过TCP本地运行的NodeJS服务器,因此允许它绑定到所有接口的IMO'0.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。这是一个计算机网络的基本概念。 –

回答

4

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

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

+0

只是要确认你的声明,使用'0.0.0.0'允许我连接'localhost','127.0.0.1','192.168.1.74',但如果我绑定到一个特定的IP,我**有**无论我从哪里连接,都可以使用相同的IP。例如如果我在同一台机器上运行另一个客户端,而我绑定到'192.168.1.74',那么我不能使用'localhost',我必须使用相同的IP。 –

+0

是的,您确实需要使用服务器正在侦听的确切IP。如果你想听localhost和192.168.1.74,你需要使用0.0.0.0或创建多个套接字。 – Desirius

+0

本地主机可以是127.0.0.1,但DNS设置可以使其他值,:: 0或其他值。所以不要做出假设,并且总是检查DNS解析。 –

相关问题