Не существует механизма 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()
на сокете, если у вас не должно бытьв первую очередь принял соединение.