创建仅限本地连接的套接字

10 投票
6 回答
18073 浏览
提问于 2025-04-15 18:27

我有一个用Python写的程序,里面有很多线程。我在想要不要创建一个套接字,把它绑定到本地,也就是让这些线程可以在这个中心位置进行读写。不过,我不想让这个套接字对整个网络开放,只想接受来自127.0.0.1的连接。请问我该怎么做(用Python)?这样设计合适吗?或者有没有更优雅的做法?

6 个回答

3

如果你在使用基于UNIX的系统,可能会想要考虑使用UNIX域套接字,而不是互联网套接字。我觉得下面这样的代码应该可以工作:

>>> # in one window/shell
>>> import socket
>>> sd = socket.socket(socket.AF_UNIX)
>>> sd.bind('/path/to/my/socket')
>>> sd.listen(5)
>>> (client,addr) = sd.accept()
>>> client.recv(1024)
'hello'
>>>

>>> # in a different shell
>>> import socket
>>> sd = socket.socket(socket.AF_UNIX)
>>> sd.connect('/path/to/my/socket')
>>> sd.send('hello')
5

http://www.amk.ca/python/howto/sockets/

这里展示了一些关于套接字的例子。我觉得这个小知识对你来说挺有意思的。

我们使用了 socket.gethostname(),这样套接字就能被外界看到。如果我们用了 s.bind(('', 80))、s.bind(('localhost', 80)) 或者 s.bind(('127.0.0.1', 80)),那么我们依然会有一个“服务器”套接字,但这个套接字只能在同一台机器上被看到。

我想这就是你的答案了(下面有更正

至于用这种方法进行线程间通信的有效性,我不太确定它能处理多个线程的读写情况。

编辑

下面似乎有一个 Python 的例子,涉及到线程间通信。

http://code.activestate.com/recipes/491281/

玩得开心!

编辑

这篇文章有误,正如所指出的那样:“s.bind(('', 80)) 会绑定到 INADDR_ANY”。

9

当你用 socket.socket() 创建了一个套接字后,你可以在开始监听之前使用 bind() 方法:

socket.bind(('127.0.0.1', 80))

使用地址 127.0.0.1 表示这个套接字只会绑定到本地接口,也就是只在你自己的电脑上使用。

撰写回答