Передача сокетов между процессами


передача сокета между процессами в Linux

Как я могу передать владение сокетом между процессами в Linux? Windows имеет Socket.DuplicateAndClose функция, но есть ли способ сделать это в Linux?

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

Решение

Дочерний процесс унаследует файловый дескриптор. Таким образом, вам нечего делать, кроме как закрыть сокет в родительском элементе после того, как вы разветвили дочерний элемент.

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

Другие решения

Учитывая, что вы хотите порождать потомка после создания сокета, передача не происходит. Дочерние процессы наследуют родительские дескрипторы. Итак, родитель просто должен закрыть сокет, чтобы передать владение ребенку.

Тем не менее, чтобы фактически передать вновь созданный сокет в существующий процесс,
вам нужно использовать вспомогательные данные интерфейс для упаковки вашего сокета, и sendmsg а также recvmsg сделать передачу данных. cmsg Страница руководства содержит пример того, как создать сообщение для передачи.

Передача сокета между процессами в Linux

Как передать права собственности на сокет между процессами под Linux? У Windows есть функция Socket.DuplicateAndClose , но есть ли способ сделать это в Linux?

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

Детский процесс наследует дескриптор файла. Таким образом, вам нечего делать, кроме закрытия сокета в родительском после того, как вы разветкили его.

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

Учитывая, что вы хотите породить ребенка после создания сокета, передача отсутствует. Дочерние процессы наследуют родительские дескрипторы. Таким образом, родительский элемент просто должен закрыть сокет, чтобы передать права собственности дочернему устройству.

Однако, чтобы фактически передать вновь созданный сокет в существующий процесс, вам необходимо использовать вспомогательные данные для упаковки вашего сокета и sendmsg и recvmsg , чтобы выполнить передачу данных. На странице руководства cmsg приведен пример создания сообщения для передачи.

Передача объектов сокетов между процессами, TCP, Java

Итак, я обнаружил, что сокеты не сериализуемы . поэтому я не могу передать их через TCP .

Моя проблема в том, что у меня есть домашнее задание, где у меня есть 10 серверов, которые должны прослушивать один сокет (давайте назовем это request). Для ввода из любого числа клиентов x, которые пишут в этот сокет. Затем, после того, как один из процессов сервера читает сообщение из запроса, он должен связаться с этим клиентом через собственный сокет .

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

Любые советы о том, как я мог бы сделать это? Наличие TCP не 1-1 действительно играет со мной здесь.

Передача сокета по TCP-соединению — это все равно что пытаться передать телефон по телефонному звонку или отправить факс на ваш факсимильный аппарат. Что вам нужно сделать, это организовать еще одну связь между заинтересованными сторонами.

РЕДАКТИРОВАТЬ: На самом деле ваше назначение, как указано, даже не имеет смысла:

У меня есть 10 серверов, которые должны прослушивать один сокет (давайте назовем его запрос).

Это даже не правильная терминология. Серверы прослушивают порты, а не сокеты, и 10 серверов прослушивают один порт невозможно. У каждого должен быть свой порт.

Для ввода из любого числа клиентов x, которые пишут в этот сокет.

Смотри выше. Клиенты не пишут в «этот сокет». Они создают свой собственный сокет, который подключен к порту сервера, и пишут в него.

Затем, после того, как один из процессов сервера прочитает сообщение из запроса, он должен связаться с этим клиентом через собственный сокет.

Если сервер получил соединение от клиента, у него уже есть сокет, представляющий его конечную точку для этого соединения. Таким образом, все, что нужно сделать серверу, это записать ответ обратно в тот же сокет, из которого он прочитал запрос.

Короче говоря, у вас есть большая проблема с терминологией, но у вас нет проблем с программным обеспечением вообще.

Передача сокета между процессами в Linux

Как передать права собственности на сокет между процессами под Linux? У Windows есть функция Socket.DuplicateAndClose , но есть ли способ сделать это в Linux?

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

c++ linux process sockets

2 ответа

3 Решение fjardon [2015-11-16 19:41:00]

Детский процесс наследует дескриптор файла. Таким образом, вам нечего делать, кроме закрытия сокета в родительском после того, как вы разветкили его.

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

2 jxh [2015-11-16 19:48:00]

Учитывая, что вы хотите породить ребенка после создания сокета, передача отсутствует. Дочерние процессы наследуют родительские дескрипторы. Таким образом, родительский элемент просто должен закрыть сокет, чтобы передать права собственности дочернему устройству.

Однако, чтобы фактически передать вновь созданный сокет в существующий процесс, вам необходимо использовать вспомогательные данные для упаковки вашего сокета и sendmsg и recvmsg , чтобы выполнить передачу данных. На странице руководства cmsg приведен пример создания сообщения для передачи.

Передача сокетов между процессами

Для того, чтобы передать сокет от одного процесса другому, можно воспользоваться функцией WSADuplicateSocket() из Winsock 2. Изначально в часто задаваемых вопросах (FAQ) эту проблему решали следующим способом:

Спецификация данного метода подробно описывается в секции 2.10 MSDN-а, где подробно по шагам комментируется данная функция. Так же можно почитать статью Q150523 в Microsoft Knowledge Base, в которой описываются различия наследования сокета в разных версиях Windows.

Илон Маск рекомендует:  VarTypeMask - Константа

Другая забавная особенность Win32 API заключается в том, что он позволяет присваивать новому процессу (во время его создания) различные «стандартные обработчики» («standard handles») (stdin, stdout и stderr). Статья Q190351 в MSKB описывает данный момент. Обратите внимание, что данная возможность доступна только для дочерних процессов; т.е. Вы не сможете перенаправить стандартный обработчик I/O на сокет. Естевственно, что данная возможность не предоставляет нам таких преимуществ, как, например, Unix-функция dup2().

Так же в FAQ сказано, что мы не можем использовать такую возможность в Winsock 1.1. Однако Frank Schmied показал, что можно слегка обмануть стек Microsoft Winsock 1.1 в Win32, и в конечном результате добиться своей цели. Вот его комментарии:

Можно заставить Winsock 1.1 передавать сокет от одного процесса другому используя Win32 функцию DuplicateHandle(). Обработка данного вызова может быть весьма сложной. Фактически, генерация реальных дескрипторов процесса не так проста, как может показаться на первый взгляд. Windows использует два типа дескрипторов окна: псевдо-дескрипторы и реальные дескрипторы. Обычно дескрипторы в Windows — это адреса в памяти, и экземпляр дескриптора является ни чем иным как смещением указателя на код, расположенный в текущем адресном пространстве. Итак, дескриптор процесса HINSTANCE (псевдо или локальный) обычно равен 0x4000000. Передача данного дескриптора от одного процесса к другому не работает. Чтобы получить реальный дескриптор текущего процесса, можно использовать OpenProcess():

Создание дубликата дескриптора выглядит примерно так:

Данный пример отлично работает на многопроцессорном вебсервере. Данная функция передаёт сокет в новый процесс и закрывает дескриптор старого процесса. Дескриптор имеет те же свойства что и старый, но не может быть унаследован дочерним процессом. Чтобы исправить это, достаточно в DuplicateHandle() изменить FALSE на TRUE. Как мы видим, дескриптор основного процесса может быть псевдо-дескриптором, но дескриптор второго процесса обязан быть реальным.

Алгоритм таков: исходный процесс конвертирует локальный дескриптор SOCKET в реальный дескриптор при помощи OpenProcess(), затем передаёт это значение и ID процесса другому процессу. Второй процесс вызывает функцию ConvertProcessSocket(), чтобы преобразовать реальный дескриптор в локальный, который уже можно будет использовать в Winsock. Обратите внимание, что вызов DuplicateHandle() закрывает дескриптор первого процесса, а затем функция CloseHandle() закрывает реальный дескриптор, который вы передаёте второму процессу.

Недостатки: данная методика скорее всего работает только со стеком Microsoft. Однозначно не будет работать в Win16, и, возможно в WinCE. Не извесно, будет или нет работать в присутствие Layered Service Providers, исключая Windows NT 4.0 SP 4+, в которой пропатчен уровень Installable FileSystems (IFS). Возможно найдутся ещё причины, по которым данный метод может не сработать :)

Передача сокетов между процессами

Авторы: Warren Young и Frank Schmied

Для того, чтобы передать сокет от одного процесса другому, можно воспользоваться функцией WSADuplicateSocket() из Winsock 2. Изначально в часто задаваемых вопросах (FAQ) эту проблему решали следующим способом:

Спецификация данного метода подробно описывается в секции 2.10 MSDN-а, где подробно по шагам комментируется данная функция. Так же можно почитать статью Q150523 в Microsoft Knowledge Base, в которой описываются различия наследования сокета в разных версиях Windows.

Другая забавная особенность Win32 API заключается в том, что он позволяет присваивать новому процессу (во время его создания) различные «стандартные обработчики» («standard handles») (stdin, stdout и stderr). Статья Q190351 в MSKB описывает данный момент. Обратите внимание, что данная возможность доступна только для дочерних процессов; т.е. Вы не сможете перенаправить стандартный обработчик I/O на сокет. Естевственно, что данная возможность не предоставляет нам таких преимуществ, как, например, Unix-функция dup2().

Так же в FAQ сказано, что мы не можем использовать такую возможность в Winsock 1.1. Однако Frank Schmied показал, что можно слегка обмануть стек Microsoft Winsock 1.1 в Win32, и в конечном результате добиться своей цели. Вот его комментарии:

Можно заставить Winsock 1.1 передавать сокет от одного процесса другому используя Win32 функцию DuplicateHandle(). Обработка данного вызова может быть весьма сложной. Фактически, генерация реальных дескрипторов процесса не так проста, как может показаться на первый взгляд. Windows использует два типа дескрипторов окна: псевдо-дескрипторы и реальные дескрипторы. Обычно дескрипторы в Windows — это адреса в памяти, и экземпляр дескриптора является ни чем иным как смещением указателя на код, расположенный в текущем адресном пространстве. Итак, дескриптор процесса HINSTANCE (псевдо или локальный) обычно равен 0x4000000. Передача данного дескриптора от одного процесса к другому не работает. Чтобы получить реальный дескриптор текущего процесса, можно использовать OpenProcess():

Создание дубликата дескриптора выглядит примерно так:

Данный пример отлично работает на многопроцессорном вебсервере. Данная функция передаёт сокет в новый процесс и закрывает дескриптор старого процесса. Дескриптор имеет те же свойства что и старый, но не может быть унаследован дочерним процессом. Чтобы исправить это, достаточно в DuplicateHandle() изменить FALSE на TRUE. Как мы видим, дескриптор основного процесса может быть псевдо-дескриптором, но дескриптор второго процесса обязан быть реальным.

Алгоритм таков: исходный процесс конвертирует локальный дескриптор SOCKET в реальный дескриптор при помощи OpenProcess(), затем передаёт это значение и ID процесса другому процессу. Второй процесс вызывает функцию ConvertProcessSocket(), чтобы преобразовать реальный дескриптор в локальный, который уже можно будет использовать в Winsock. Обратите внимание, что вызов DuplicateHandle() закрывает дескриптор первого процесса, а затем функция CloseHandle() закрывает реальный дескриптор, который вы передаёте второму процессу.

Недостатки: данная методика скорее всего работает только со стеком Microsoft. Однозначно не будет работать в Win16, и, возможно в WinCE. Не извесно, будет или нет работать в присутствие Layered Service Providers, исключая Windows NT 4.0 SP 4+, в которой пропатчен уровень Installable FileSystems (IFS). Возможно найдутся ещё причины, по которым данный метод может не сработать

Передача объектов сокетов между процессами, TCP, Java

February 2020

1.2k раз

Хорошо, таким образом, я нашел из розетки не сериализации . так что я не могу передать их TCP .

Моя проблема в том, у меня есть домашнее задание, где у меня есть 10 серверов, которые должны слушать на один сокет (назовём его запрос). Для ввода любых из х чисел клиентов, которые записывают в сокет. Затем после того, как один из процессов сервера читает сообщение из запроса он должен взаимодействовать с этим клиентом над своим собственным гнездом .

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

Илон Маск рекомендует:  Что такое код dbplus_first

Любые советы о том, как я могу это сделать? Имея TCP не будет 1-1 действительно играл со мной здесь.

2 ответы

Passing a socket over a TCP connection is like trying to pass a telephone over a telephone call, or trying to fax your fax machine. What you need to do is organize another connection between the parties concerned.

EDIT: In fact your assignment as stated doesn’t even make sense:

I have 10 servers that must listen on one socket(lets call it request).

That’s not even correct terminology. Servers listen at ports, not sockets, and 10 servers listening at one port is impossible. They must each have their own port.

For input from any of x number of clients that write to that socket.

See above. Clients don’t write to ‘that socket’. They create their own socket that is connected to the server port, and they write to that.

Then after one of the server processes reads a message from request it must communicate with that client over its own socket

If the server has received a connection from a client it already has a socket representing its endpoint to that connection. So all the server has to do is write the response back to the same socket it read the request from.

In short you have a major terminology problem, but you don’t have a software problem at all.

Передача сокетов между процессами?

Можно ли каким-то образом передать подключенные сокеты между процессами?

Что у меня есть сервер, с подключенными сокетами (TCP). Иногда мне нужно перезапустить программу, но пока вы перезагрузки, все соединения разрываются, поэтому все подключенные пользователи должны воссоединиться.


Можно ли «передача» эти соединения на к другому процессу, так что я могу перезапустить основную программу, а затем переместить подключения к сокету назад к основной программе? Что-то вроде «Хост миграции» в Call Of Duty игры.

Socket.DuplicateAndClose метод преобразует сокет в форму , можно перейти к другому процессу , который затем может открыть сокет.

(CoD :) Забавно . что твоя ручка? Мы будем играть где-то)

Во всяком случае, на самом деле не . если вы не код клиента для обработки исключений и воссоединиться в случае необходимости. В качестве альтернативы, вы можете иметь балансировки нагрузки-маршрутизатор перед вашими хозяевами. WCF Peer сети приходит на ум.

Сетевое программирование для разработчиков игр. Часть 2: прием и передача пакетов данных

Прием и передача пакетов данных

Введение

Привет, меня зовут Гленн Фидлер и я приветствую вас в своей второй статье из цикла “Сетевое программирование для разработчиков игр”.

В предыдущей статье мы обсудили различные способы передачи данных между компьютерами по сети, и в конце решили использовать протокол UDP, а не TCP. UDP мы решили использовать для того, чтобы иметь возможность пересылать данные без задержек, связанных с ожиданием повторной пересылки пакетов.

А сейчас я собираюсь рассказать вам, как на практике использовать UDP для отправки и приема пакетов.

BSD сокеты

В большинстве современных ОС имеется какая-нибудь реализация сокетов, основанная на BSD сокетах (сокетах Беркли).

Сокеты BSD оперируют простыми функциями, такими, как “socket”, “bind”, “sendto” и “recvfrom”. Конечно, вы можете обращаться к этим функциями напрямую, но в таком случае ваш код будет зависим от платформы, так как их реализации в разных ОС могут немного отличаться.

Поэтому, хоть я далее и приведу первый простой пример взаимодействия с BSD сокетами, в дальнейшем мы не будем использовать их напрямую. Вместо этого, после освоения базового функционала, мы напишем несколько классов, которые абстрагируют всю работу с сокетами, чтобы в дальнейшем наш код был платформонезависимым.

Особенности разных ОС

Для начала напишем код, который будет определять текущую ОС, чтобы мы могли учесть различия в работе сокетов:

Теперь подключим заголовочные файлы, нужные для работы с сокетами. Так как набор необходимых заголовочных файлов зависит от текущей ОС, здесь мы используем код #define, написанный выше, чтобы определить, какие файлы нужно подключать.

В UNIX системах функции работы с сокетами входят в стандартные системные библиотеки, поэтому никакие сторонние библиотеки нам в этом случае не нужны. Однако в Windows для этих целей нам нужно подключить библиотеку winsock.

Вот небольшая хитрость, как можно это сделать без изменения проекта или makefile’а:

Мне нравится этот прием потому, что я ленивый. Вы, конечно, можете подключить библиотеку в проект или в makefile.

Инициализация сокетов

В большинстве unix-like операционных систем (включая macosx) не требуется никаких особых действий для инициализации функционала работы с сокетами, но в Windows нужно сначала сделать пару па — нужно вызвать функцию “WSAStartup” перед использованием любых функций работы с сокетами, а после окончания работы — вызвать “WSACleanup”.

Давайте добавим две новые функции:

Теперь мы имеем независимый от платформы код инициализации и завершения работы с сокетами. На платформах, которые не требуют инициализации, данный код просто не делает ничего.

Создаем сокет

Теперь мы можем создать UDP сокет. Это делается так:

Далее мы должны привязать сокет к определенному номеру порта (к примеру, 30000). У каждого сокета должен быть свой уникальный порт, так как, когда приходит новый пакет, номер порта определяет, какому сокету его передать. Не используйте номера портов меньшие, чем 1024 — они зарезервированы системой.

Если вам все равно, какой номер порта использовать для сокета, вы можете просто передать в функцию “0”, и тогда система сама выделит вам какой-нибудь незанятый порт.

Теперь наш сокет готов для передачи и приема пакетов данных.

Но что это за таинственная функция “htons” вызывается в коде? Это просто небольшая вспомогательная функция, которая переводит порядок следования байтов в 16-битном целом числе — из текущего (little- или big-endian) в big-endian, который используется при сетевом взаимодействии. Ее нужно вызывать каждый раз, когда вы используете целые числа при работе с сокетами напрямую.

Вы встретите функцию “htons” и ее 32-битного двойника — “htonl” в этой статье еще несколько раз, так что будьте внимательны.

Перевод сокета в неблокирующий режим

По умолчанию сокеты находится в так называемом “блокирующем режиме”. Это означает, что если вы попытаетесь прочитать из него данные с помощью “recvfrom”, функция не вернет значение, пока не сокет не получит пакет с данными, которые можно прочитать. Такое поведение нам совсем не подходит. Игры — это приложения, работающие в реальном времени, со скоростью от 30 до 60 кадров в секунду, и игра не может просто остановиться и ждать, пока не придет пакет с данными!

Илон Маск рекомендует:  $IfOpt - Директива компилятора Delphi

Решить эту проблему можно переведя сокет в “неблокирующий режим” после его создания. В этом режиме функция “recvfrom”, если отсутствуют данные для чтения из сокета, сразу возвращает определенное значение, показывающее, что нужно будет вызвать ее еще раз, когда в сокете появятся данные.

Перевести сокет в неблокирующий режим можно следующим образом:

Как вы можете видеть, в Windows нет функции “fcntl”, поэтому вместе нее мы используем “ioctlsocket”.

Отправка пакетов

UDP — это протокол без поддержки соединений, поэтому при каждой отправке пакета нам нужно указывать адрес получателя. Можно использовать один и тот же UDP сокет для отправки пакетов на разные IP адреса — на другом конце сокета не обязательно должен быть один компьютер.

Переслать пакет на определенный адрес можно следующим образом:

Обратите внимание — возвращаемое функцией “sendto” значение показывает только, был ли пакет успешно отправлен с локального компьютера. Но оно не показывает, был ли пакет принят адресатом! В UDP нет средств для определения, дошел ли пакет по назначению или нет.

В коде, приведенном выше, мы передаем структуру “sockaddr_in” в качестве адреса назначения. Как нам получить эту структуру?

Допустим, мы хотим отправить пакет по адресу 207.45.186.98:30000.

Запишем адрес в следующей форме:

И нужно сделать еще пару преобразований, чтобы привести его к форме, которую понимает “sendto”:

Как видно, сначала мы объединяем числа a, b, c, d (которые лежат в диапазоне [0, 255]) в одно целое число, в котором каждый байт — это одно из исходных чисел. Затем мы инициализируем структуру “sockaddr_in” нашими адресом назначения и портом, при этом не забыв конвертировать порядок байтов с помощью функций “htonl” и “htons”.

Отдельно стоит выделить случай, когда нужно передать пакет самому себе: при этом не нужно выяснять IP адрес локальной машины, а можно просто использовать 127.0.0.1 в качестве адреса (адрес локальной петли), и пакет будет отправлен на локальный компьютер.

Прием пакетов

После того, как мы привязали UDP сокет к порту, все UDP пакеты, приходящие на IP адрес и порт нашего сокета, будут ставиться в очередь. Поэтому для приема пакетов мы просто в цикле вызываем “recvfrom”, пока он не выдаст ошибку, означающую, что пакетов для чтения в очерели не осталось.

Так как протокол UDP не поддерживает соединения, пакеты могут приходить с множества различных компьютеров сети. Каждый раз, когда мы принимаем пакет, функция “recvfrom” выдает нам IP адрес и порт отправителя, и поэтому мы знаем, кто отправил этот пакет.

Код приема пакетов в цикле:

Пакеты, размер которых больше, чем размер буфера приема, будут просто втихую удалены из очереди. Так что, если вы используете буфер размером 256 байтов, как в примере выше, и кто-то присылает вам пакет в 300 байт, он будет отброшен. Вы не получите просто первые 256 байтов из пакета.

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

Закрытие сокета

На большинстве unix-like систем, сокеты представляют собой файловые дескрипторы, поэтому для того, чтобы закрыть сокеты после использования, можно использовать стандартную функцию “close”. Однако, Windows, как всегда, выделяется, и в ней нам нужно использовать “closesocket”.

Так держать, Windows!

Класс сокета

Итак, мы разобрались со всеми основными операциями: создание сокета, привязка его к порту, перевод в неблокирующий режим, отправка и прием пакетов, и, в конце, закрытие сокета.

Но, как вы могли заметить, все эти операции немного отличаются от платформы к платформе, и, конечно, трудно каждый раз при работе с сокетами вспоминать особенности разных платформ и писать все эти #ifdef.

Поэтому мы сделаем класс-обертку “Socket” для всех этих операций. Также мы создадим класс “Address”, чтобы было проще работать с IP адресами. Он позволит не проводить все манипуляции с “sockaddr_in” каждый раз, когда мы захотим отправить или принять пакет.

Итак, наш класс Socket:

И класс Address:

Использовать их для приема и передачи нужно следующим образом:

Как видите, это намного проще, чем работать с BSD сокетами напрямую. И также этот код будет одинаков для всех ОС, потому весь платформозависимый функционал находится внутри классов Socket и Address.

Заключение

Теперь у нас есть независимый от платформы инструмент для отправки и према UDP пакетов.

UDP не поддерживает соединения, и мне хотелось сделать пример, который бы четко это показал. Поэтому я написал небольшую программу, которая считывает список IP адресов из текстового файла и рассылает им пакеты, по одному в секунду. Каждый раз, когда программа принимает пакет, она выводит в консоль адрес и порт компьютера-отправителя и размер принятого пакета.

Вы можете легко настроить программу так, чтобы даже на локальной машине получить несколько узлов, обменивающихся пакетами друг с другом. Для этого просто разным экземплярам программы задайте разные порты, например:

> Node 30000
> Node 30001
> Node 30002
И т.д…

Каждый из узлов будет пересылать пакеты всем остальным узлам, образуя нечто вроде мини peer-to-peer системы.

Я разрабатывал эту программу на MacOSX, но она должна компилироваться на любой unix-like ОС и на Windows, однако если вам для этого потребуется делать какие-либо доработки, сообщите мне.

Передача сокета между процессами в Linux

Как передать права собственности на сокет между процессами под Linux? У Windows есть функция Socket.DuplicateAndClose , но есть ли способ сделать это в Linux?

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

c++ linux process sockets

2 ответа

3 Решение fjardon [2015-11-16 19:41:00]

Детский процесс наследует дескриптор файла. Таким образом, вам нечего делать, кроме закрытия сокета в родительском после того, как вы разветкили его.

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

2 jxh [2015-11-16 19:48:00]

Учитывая, что вы хотите породить ребенка после создания сокета, передача отсутствует. Дочерние процессы наследуют родительские дескрипторы. Таким образом, родительский элемент просто должен закрыть сокет, чтобы передать права собственности дочернему устройству.

Однако, чтобы фактически передать вновь созданный сокет в существующий процесс, вам необходимо использовать вспомогательные данные для упаковки вашего сокета и sendmsg и recvmsg , чтобы выполнить передачу данных. На странице руководства cmsg приведен пример создания сообщения для передачи.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL