Примечание: Основываясь на ответе ниже, я думаю, что я не правильно изложил этот вопрос. В настоящее время я переписываю его с кодом, чтобы быть более понятным.
Я пишу сервер python, который принимает подключения нескольких клиентов и сохраняет их.
Если я распечатываю правильно подключенный сокет, который используется для связи с одним из подключенных клиенты, я бы получил что-то вроде следующего:
<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0, laddr=('3.3.3.3', 1234), raddr=('4.4.4.4', 63402)>
, где в целях конфиденциальности я заменил IP моего сервера на 3.3.3.3 и IP клиента на 4.4.4.4. Я действительно надеялся, что сработает, - это сохранить информацию в файл в формате:
4 2049
, а затем, когда загрузится дочерний процесс, он передаст эту информацию конструктор сокета, использующий:
recovered_client = socket(AF_INET, 2049, 0, 4)
Но это не работает. Когда я применяю этот процесс и печатаю восстановленный клиент, я вижу следующее:
<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0>
Кажется, что поля laddr и raddr из исходного соединения не удалось восстановить, передав дескриптор файла в конструктор.
Я попытался исправить это вручную, добавив в файл хост и порт из laddr и raddr, а затем подключившись с помощью команды:
recovered_client.connect(('4.4.4.4', 63402))
Но это приводит к ошибке:
OSError: [Errno 88] Socket operation on non-socket
В качестве эксперимента я оставил соединение открытым в родительском процессе, а затем разрешил дочернему процессу принять новое соединение fre sh и распечатать это, и то, что я получил, было:
<socket.socket fd=4, family=AddressFamily.AF_INET, type=2049, proto=0, laddr=('3.3.3.3', 1234), raddr=('75.159.78.189', 49709)>
Другими словами, было установлено новое соединение с тем же значением для fd , с другим клиентским портом. Исходное соединение никогда не закрывалось, а зависало бесконечно, потому что, как и предполагалось, родительский процесс завис, когда вызывал дочерний процесс.
Таким образом, это означает, что у меня есть два разных активных соединения (хотя одно было заморожено), чьи сокеты имеют одинаковые файловые дескрипторы. Означает ли это, что значение, присвоенное полю fd для сокета, относится к процессу, который его создал?
Если это так, мой подход явно безнадежен. Как я могу передать соединение моего клиента, созданное в моем родительском процессе, его дочернему процессу?