проблема с модулем Python `IN` (FreeBSD) - PullRequest
1 голос
/ 09 июня 2010

я пытаюсь работать с сокетами и у меня такая проблема

В примере кода:

setsockopt(socket.SOL_SOCKET,IN.SO_BINDTODEVICE,self.listen_address+'\0')

У меня ошибка

AttributeError: 'module' object has no attribute 'SO_BINDTODEVICE'

На машине с Linux этот атрибут в порядке, но во FreeBSD нет никаких атрибутов SO_ * в модуле IN. Какой порт я должен установить, чтобы решить эту проблему на компьютере с FreeBDS?

Проверенные версии Python для Linux: 2.5.4 и 2.6.4; на FreeBSD: 2.5.5

Я не могу найти ничего об этом модуле в своей книге, и ключевое слово googling IN выглядит как бесшовное ...

Обновление:

Я могу привязать только к адресу, а не к устройству.

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.bind(("eth0",3040))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in bind
socket.gaierror: [Errno -2] Name or service not known
>>> s.bind(("192.168.33.152",3040))
>>> s.close()

обновление 2:

... но я работаю с широковещательными пакетами. Я пытаюсь написать демон, который действует как сервер DHCP. Если я свяжусь с адресом, поймал бы я широковещательные пакеты? А если я включу беспорядочный режим?

1 Ответ

1 голос
/ 09 июня 2010

SO_BINDTODEVICE опция сокета не является стандартной и не поддерживается во FreeBSD.Почему вы не можете просто использовать обычные bind(2) для назначения локального адреса / интерфейса?

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

Взгляните на документацию по сокетам .
Вот пример .

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

Вы не сказали, чего именно пытаетесь достичь, поэтому предполагаете, что используется обычный TCP / IPклиент-сервер.

IP, являющийся протоколом сетевого уровня (в отличие, например, от Ethernet, который является протоколом передачи данных), не имеет отношения к устройствам, а адресов .Идея состоит в том, что вам не нужно для привязки к устройству - ОС заботится о сопоставлении адресов с устройствами и поддерживает таблицу маршрутизации .Единственное время, когда вам нужна явная связь между сокетом и устройством, - это при работе с broadcast и multicast , где сопоставление адресов и интерфейсов не очевидно.

КаждыйСетевому интерфейсу, известному стеку TCP / IP, назначен IP-адрес (см. ifconfig(8)).Свяжите ваш сокет с этим IP-адресом, и все будет готово.

Надеюсь, это поможет.

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

Вы рассматривали вариант SO_BROADCAST?Также проверьте этот ТАК вопрос о необработанных сокетах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...