Python套接字只接受本地连接

时间:2011-04-19 00:57:31

标签: python windows sockets

服务器:

import socket

host = ""
port = 4242
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
client, address = s.accept()
while 1:

    data = client.recv(size)
    if data:
        client.send(data)
        print(data.decode("utf-8"))

客户端:

import socket
import sys

host = sys.argv[1]
port = 4242
size = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while True:
    line = input("What to say: ")
    s.send(line.encode("utf-8"))
嗯,我在这里有点困惑。我开始学习套接字了,所以我开始使用一个简单的echo服务器。当服务器在Arch Linux或Ubuntu上运行时,我上面发布的代码可以很好地工作。但是,当它在Windows 7上时,它只接受本地连接。问题是,我没有运行防火墙。我不确定Python是否有单独的WinSock实现或什么,但我很困惑!如果你愿意的话,我很清楚这个设计非常糟糕(只接受客户端!),但我只是想知道为什么Windows不接受远程连接。

如果有帮助的话,在Arch和Ubuntu上,我正在运行Python 3.1,而在Win 7上它运行在3.2。

2 个答案:

答案 0 :(得分:8)

声音host=''默认绑定到Win 7下的localhost(127.0.0.1)(目前我无法访问Win 7计算机)。

要使服务器在主机上的所有(IPv4)接口上都可访问,这应该适用于Linux,Windows,Mac等:

host = '0.0.0.0'
s.bind((host, 8080))

要验证套接字绑定到哪个地址,您可以执行以下操作:

>>> s.getsockname()
('0.0.0.0', 8080)

答案 1 :(得分:0)

正如Socket所述的文档:

  

某些行为可能与平台有关,因为会对操作系统套接字进行调用   的API。

我不熟悉Win32网络编程,但我猜测它可能是一个特定于实现的行为,当你创建一个套接字而不将它绑定到一个地址时会触发它。

我的建议是提升抽象级别并使用SocketServer