Создание гнезда, ограниченного localhost связями только

У меня есть программа питона со многими нитями. Я думал о создании гнезда, свяжите его с localhost и имейте чтение-запись нитей к этому центральному расположению. Однако я не хочу это гнездо, открытое для остальной части сети, просто связи от 127.0.0.1 должен быть принят. Как я сделал бы это (в Пайтоне)? И действительно ли это - подходящий дизайн? Или есть ли что-то немного более изящное?

9
задан Glenn Maynard 25 January 2010 в 21:13
поделиться

6 ответов

Учитывая розетку, созданную с помощью Socket.Socket () , вы можете использовать BING () перед прослушиванием:

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

с помощью адреса 127.0.0.1 Указывает, что сокет должен связываться только с локальным интерфейсом.

7
ответ дан 4 December 2019 в 12:18
поделиться

Возможно, вы захотите использовать модуль очередей из стандартной библиотеки. Он разработан специально для облегчения связи между потоками. Цитата из документов:

Модуль очереди реализует многопроизводитель, несколько потребительских очередей. Это особенно полезно в резьбовом программировании, когда информация должна быть безопасно обменяться между несколькими потоками. Класс очереди в этом модуле реализует все необходимые блокирующие семантику. Это зависит от наличия поддержки резьбы в Python; Смотрите модуль для резьбы.

2
ответ дан 4 December 2019 в 12:18
поделиться

Notionon TCP / IP Networks 127.0.0.0/8 - ненаправленная сеть, поэтому вы не должны иметь возможность отправлять IP Datagram, предназначенную для 127.0.0.1. Маршрутизатор просто будет отменить дейтаграмму. Тем не менее, можно построить и отправлять дейтаграммы с адресом назначения 127.0.0.1, поэтому хост в одной и той же сети (IP Sense of Network), поскольку ваш хост, возможно, может получить дейтаграмму в стек TCP / IP-адреса вашего хоста. Вот где находится ваш локальный боермер. Ваш локальный (Host) брандмауэр должен иметь правило, которое отбрасывает IP Datagrams, предназначенные для 127.0.0.0/8, входящих в любой интерфейс, отличный от LO0 (или эквивалентного взаимодействия обратной связи). Если ваш хост либо 1) имеет такие правила брандмауэра на месте или 2), существуют в своей собственной сети (или совместно используются только с полностью доверенными хостами) и за хорошо настроенным маршрутизатором, вы можете смело просто привязать к 127.0.0.1 и быть довольно уверенным Datagrams Вы получаете на розетке с локальной машины. Предыдущие ответы обращаются к тому, как открыть и связываться с 127.0.0.1.

0
ответ дан 4 December 2019 в 12:18
поделиться

Если вы делаете SOCK.BIND ((порт, 127.0.0.1 ')), он будет только слушать Localhost, а не на других интерфейсах, так что все, что вам нужно.

0
ответ дан 4 December 2019 в 12:18
поделиться

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

показывает какой-то пример сокета. Этот тидбит интересен вам, я думаю, что

мы использовали Socket.GeathostName (), чтобы сокет был бы виден внешним миром. Если бы мы использовали S.Bind (('', 80)) или S.Bind (('localhost', 80)) или S.Bind (('127.0.0.1', 80)) у нас все равно будет иметь "сервер «Розетка, но тот, который был виден только в одной и той же машине.

Я думаю, что есть ваш ответ ( см. Ниже для коррекции )

относительно действительности использования этого метода для потоков связи. Я не уверен, насколько хорошо это обрабатывает несколько потоков и чтение / запись

Редактировать

, кажется, есть рецепт Python, связанный ниже, который делает некоторую междоворитеную связь

http://code.activeState.com / рецепты / 491281 /

веселиться!

Редактировать

Статья неверна и как указана « S.Bind (('', 80)), будет связываться с Inaddr_any »

5
ответ дан 4 December 2019 в 12:18
поделиться

Если вы работаете в системе на основе 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')
3
ответ дан 4 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: