Передать дескриптор сокета из .NET в неуправляемый дочерний процесс - PullRequest
6 голосов
/ 05 января 2011

У меня есть программа .NET, которая инициирует соединение с сервером и запускает другой неуправляемый исполняемый файл.Собственный процесс должен занять тот же сокет (важно, чтобы соединение не было закрыто до завершения дочернего процесса!) И начать через него связь с сервером.

Вышеупомянутые программы работают как в Windows, так что я бы предпочел решение, не включающее P / Invoke для части .NET.В качестве примечания, связь между родительским и дочерним процессами не является проблемой, поэтому я могу легко обмениваться данными между ними.
Кроме того, как только я начинаю использовать сокет из собственного процесса, мне не нужно использовать его изПроцесс .NET больше, и процесс .NET будет завершаться до того, как я закончу использовать сокет от неуправляемого процесса, поэтому вместе с решением мне нужно знать, что делать с объектом Socket в .NETчто его утилизация не влияет на сокет ОС и его удобство использования.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 05 января 2011

.NET 2.0 и более поздние версии предлагают удобный метод DuplicateAndClose .

Upd: похоже, что потребуется взлом, чтобы выяснить, где (при каком смещении)SocketInformation.ProtocolInformation сохраняется сокет назначения.Это можно сделать путем захвата байтового массива в исходном процессе, а затем воссоздания сокета в другом процессе .NET и получения дескриптора сокета (в этом втором процессе).Затем посмотрите, где находятся данные в байтовом массиве.

Также есть хороший неуправляемый способ дублирования сокетов, описанный здесь .

0 голосов
/ 05 января 2011

Я думаю, что дескрипторы сокетов, созданные классом .NET Socket, наследуются по умолчанию.IIRC Если вы порождаете дочерний процесс, используя Process.Start и ProcessStartInfo.UseShellExecute = false (ShellExecute не разрешает наследование дескриптора), ваш дочерний процесс должен уже наследовать дескриптор сокета.Вы пытались просто передать Socket.Handle дочернему процессу и использовать его там?И я думаю , что, пока дочерний процесс владеет унаследованным дескриптором, сокет остается открытым даже после того, как процесс, который его создал, исчез.(Я никогда не использовал это напрямую, но у меня когда-то была средняя ошибка, вызванная этим поведением.) Однако, возможно, сокет был открыт с такими флагами, как FILE_FLAG_OVERLAPPED и т. Д., И вам придется использовать правильную комбинацию функций для доступа к нему.

...