Как разделить объект сокета TCP между родителем и (разветвленным) дочерним объектом? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть приложение, в котором мой модуль TCP-сервера (родительский) прослушивает события 'connection' и получает некоторые данные в созданном сокете для выполнения рукопожатия с удаленным клиентом. После того, как рукопожатие выполнено, серверу необходимо отправить объект сокета разветвленному дочернему элементу, который также отправит и получит данные в сокет, выполнит некоторые действия и, наконец, отправит результат родительскому элементу и будет уничтожен. По некоторым причинам мне нужно сохранить объект сокета в родительском объекте для дальнейшей обработки данных, не выполняемой в дочернем процессе, после завершения дочернего процесса.

Мне удалось отправить сокет дочернему элементу, используя метод subprocess.send(), но в этом случае сокет handle становится null в родительском элементе. Я попытался установить для параметра keepOpen значение true, и оно почти сработало, поскольку я могу отправить сокет и по-прежнему работать с ним в родительском объекте, но, похоже, он не работает должным образом, поскольку входящие данные не всегда получает ребенок 'data' слушатель событий.

Я также пытался removeListener для события 'data' от родителя до отправки сокета дочернему элементу, но это не имело никакого значения, в некоторых случаях данные все еще теряются в некоторых случаях (в некоторых других правильно получено после неожиданной задержки ...). Этот фрагмент кода иллюстрирует то, что я пытаюсь сделать:

const net = require('net');
const server = net.createServer();
const cp = require('child_process');

server.on('connection', (socket) => {
  socket.on('data', (data) => {
    // Perform handhsake
    const child = cp.fork('child.js');
    child.on('message', (result) => {
      console.log('CHILD finished processing: ', result);
      child.kill('SIGHUP');
      // Do more stuff with socket
    });
    child.send('socket', socket);
    // (At this point, socket handle is null)
  });
});
server.listen(PORT)

Я новичок в nodejs, я предполагаю, что в коде могут быть ошибки. Благодаря.

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