2014-01-09 10 views
2

У моего проекта две программы: Родитель и ребенок.Проходное гнездо для дочернего процесса

В Родительском соединении: есть одно соединение ожидания подключения от клиента. Когда Parent принимает соединение, он генерирует дочерний процесс и передает сокет Child.

SOCKET newSock = accept(listenSock, 0, 0); 
char cmd[1024]; 
sprintf(cmd, "%s %d", "Child.exe", newSock); 
result = CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInformation); 

Успешно передаются данные о передаче данных между клиентом и ребенком.

Но когда я просматриваю Google, и некоторые люди писали, что: необходимо вызвать функцию WSADuplicateSocket(), после этого передать сокет дочернему процессу.

Просьба помочь мне показать разные между двумя способами? Если я не вызываю WSADuplicateSocket(), есть ли у моей программы какая-либо ошибка или нет?

+0

'Sprintf()' опасно, так как это может привести к переполнению буфера с ненадежными данными , Вместо этого вы должны использовать '_snprintf_s' (или' snprintf' в системах, отличных от Windows). –

ответ

0

Установка параметра bInheritHandles в CreateProcess to TRUE позволяет дочернему процессу получить весь наследуемый дескриптор. Ручки сокета наследуются. always. Поэтому вам не нужен дополнительный звонок.

WSADuplicateSocket требуется только, если ручка не было унаследован (розетка была создана после начала процесса ребенка или bInheritHandles является FALSE в CreateProcess)

1

Ну, для начала SOCKET в Windows - это дескриптор (то есть указатель) и, следовательно, размер 32/64-битного байта, поэтому %d не подходит, если ваше приложение работает в 64-разрядной системе. Вместо этого вам придется использовать %p.

Помимо этого, WSADuplicateSocket() - правильный подход. MSDN говорит так:

Shared Sockets

Функция WSADuplicateSocket вводится включить общий доступ к сокетов между процессами.

Смежные вопросы