Как привязать сокет к интерфейсу в Python (отсутствует socket.SO_BINDTODEVICE) - PullRequest
4 голосов
/ 28 августа 2011

Это, наверное, очень простая вещь. Я новичок в питоне, так что не распинай меня.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth1"+'\0')

вышеупомянутая команда дает мне:

NameError: name 'IN' is not defined

единственный импорт, который у меня есть,

import socket

Ответы [ 3 ]

6 голосов
/ 28 августа 2011

Если вы не понимаете сообщение об ошибке, это означает, что вы ссылаетесь на имя IN, которое в данный момент недоступно. В вашем фрагменте кода, скорее всего, отсутствует оператор import .

Модуль сокета может не предлагать SO_BINDTODEVICE по причинам переносимости. Если вы абсолютно уверены, что работаете в Linux, который поддерживает его, попробуйте заменить его на числовое значение, равное 25:

s.setsockopt(socket.SOL_SOCKET, 25, "eth1"+'\0')

Или для Python 3:

s.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8'))
1 голос
/ 23 марта 2018

В Python, SO_BINDTODEVICE присутствует в IN модуле. Импорт IN решит проблему.

import socket
import IN

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, "eth0")
1 голос
/ 26 июля 2016

Вы можете даже «экспортировать» отсутствующий параметр:

if not hasattr(socket,'SO_BINDTODEVICE') :
    socket.SO_BINDTODEVICE = 25

, затем

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, interface+'\0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...