2

我正在尝试创建一个将在套接字上侦听的 Python 程序。我正在使用带有 Python 2.7 的 Windows 7。无论我做什么,套接字似乎都可以从本地机器访问,但不能从网络上的其他地方访问。

我有以下代码:

from werkzeug.wrappers import Request, Response

@Request.application
def application(request):
    return Response('Hello World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple

    # Using empty string or the machine's real IP address here
    # gives the same problem
    run_simple('0.0.0.0', 4000, application)

如果我从本地计算机连接,我会看到响应正常。如果我执行

$ curl 'http://192.168.1.1:4000/'

从网络上的另一个(linux)盒子,卷曲在超时之前挂了很长时间。Wireshark 显示我收到一个到端口 4000 的 SYN 数据包,但没有看到它被确认。

我已经尝试确保允许到此端口的数据包通过防火墙(我在 Wireshark 中看到 SYN 的事实表明这不是问题)。我尝试将 Python 设置为以管理员身份运行(并且我检查过它是否ctypes.windll.shell32.IsUserAnAdmin()返回 true)。这不仅仅是 Werkzeug,我也尝试过使用 Python 标准库中的 SocketServer。

在同一端口上运行 Windows Apache 可以在整个网络上正常运行,这表明网络或防火墙或我的curl请求没有问题。

netstat -an显示:

TCP    0.0.0.0:4000           0.0.0.0:0              LISTENING

编辑:我尝试过使用以下最少的代码。在服务器端(Windows 7):

import socket
s = socket.socket()
s.bind(('', 8080))
s.listen(1)
remotesock, addr = s.accept()

在 linux 客户端上:

import socket
s = socket.socket()
s.connect('192.168.1.1', 8080)

这会挂起直到超时,就像 curl 一样。

4

1 回答 1

0

我相信问题是由于您的地址绑定造成的。Python 不允许绑定到 localhost(或 0.0.0.0)的套接字从外部世界可见。将绑定更改为您的实际 IP 地址。

编辑:显示示例代码将您的代码更改为此

import socket
s = socket.socket()
s.bind(('192.168.1.1', 8080)) # assumes your machine's IP address is 192.168.1.1
s.listen(1)
remotesock, addr = s.accept()
于 2013-09-20T15:41:36.793 回答