сокет простой вопрос питон - PullRequest
0 голосов
/ 10 апреля 2011

Я создаю приложение типа голосового мессенджера ... Ожидается, что мое серверное приложение получит несколько подключений и должно иметь возможность выбрать одно подключение ...

Моя проблема в том, что я не знаю, как отобразить IP-адрес всех соединений, которые идут, прежде чем я выберу один конкретный IP-адрес и подключусь к нему. Я использую Python на Ubuntu ...

1 Ответ

3 голосов
/ 10 апреля 2011

Не существует механизма API, который позволял бы вам считывать одноранговый адрес потенциального соединения до вас accept(2) этого соединения.Он не существует на уровне сокетов, поэтому не будет и в Python.

Если вы хотите встроить способ слишком много знаний о вашей операционной среде в ваше приложение,вы всегда можете использовать libpcap или winpcap или аналогичные инструменты, чтобы прослушивать провод для входящего трафика, но (а) это требует повышенных привилегий, что часто является ужасной идеей (б) действительно не связано с большинством задач коммуникационного сервера.

Механизм tcp_wrappers выполняет accept(2) входящее соединение, вызывает getpeername(2) на сокете, а затем close(2) на сокете, если программа, использующая tcp_wrappers, не должна разговаривать с этимудаленный пэр.(См. Справочную страницу /etc/hosts.allow, /etc/hosts.deny и /etc/hosts.options, hosts.allow(5).) Это может быть грубым для клиентов, но системный администратор решил запретить общение с ними в любом случае, поэтому дружелюбие - не очень высокий приоритет.

Итак, допустимо ли просто close(2) соединений после , когда вы уже accept(2) установили соединение?Если это так, вы можете использовать socket.getpeername(), чтобы найти IP-адрес удаленного узла, сделать то, что вам нужно, а затем вызвать socket.close() на сокете, если у вас не должно бытьв первую очередь принял соединение.

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