Python socket 仅接受本地连接

4 投票
2 回答
5594 浏览
提问于 2025-04-16 16:00

服务器:

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"))

我有点困惑。我刚开始学习套接字,所以我做了一个简单的回声服务器。上面贴的代码在Arch Linux或Ubuntu上运行得很好。但是在Windows 7上,它只接受本地连接。奇怪的是,我并没有开启防火墙。我不太确定Python在Windows上是否有单独的WinSock实现,反正我就是搞不懂!请你们帮帮我,我知道这个设计很糟糕(只接受客户端连接!),但我只想知道为什么Windows不接受远程连接。

如果有帮助的话,我在Arch和Ubuntu上用的是Python 3.1,而在Windows 7上用的是3.2。

2 个回答

0

根据Socket的文档说明:

某些行为可能会依赖于平台,因为这些调用是对操作系统的socket API进行的。

我对Win32网络编程不太熟悉,但我猜测,当你创建一个socket而没有把它绑定到一个地址时,可能会触发一些特定于实现的行为。

我的建议是提高一个抽象层次,使用SocketServer

8

听起来 host='' 在Windows 7下默认是绑定到本地地址(127.0.0.1)。我现在没有Windows 7的机器可以确认。

如果你想让你的服务器在所有(IPv4)网络接口上都能被访问,这个方法在Linux、Windows、Mac等系统上都可以用:

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

要检查这个套接字绑定到了哪个地址,你可以这样做:

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

撰写回答