Дублирование сокета
Код:
sClient = WSAAccept(sServerListen, (struct sockaddr*) & clientaddr,&nSize,0,0);
дальше я создаю новый процесс в спящем режиме
Код:
CreateProcess("processproj.exe", NULL, NULL, NULL,FALSE, CREATE_SUSPENDED|CREATE_NEW_CONSOLE, config_block, NULL, &si, &pi);
дублирую сокет в 1 процесе
Код:
DuplicateHandle(GetCurrentProcess(),(HANDLE)sClient ,pi.hProcess,(HANDLE*)&DublicateSocket,0,FALSE,DUPLICATE_SAME_ACCESS)
передаю DublicateSocket этому процесу и запускаю его на выполнение
Код:
ResumeThread(pi.hThread);
пытаюсь в 2 процесе записать в полученый сокет чтото
Код:
send(Socket, lpSendBuff, 3, 0);
и получаю ошибку 10038, тоесть Socket это не сокет.
значения сокета в 1 и 2 процесе одинаковые, так что сама передача правильна. Функция DuplicateHandle срабатывает без ошибок.
Посмотрел в интернете все похожие темы + в книжке Рихтера - делаю тоже самое.
Вот пару сылок на которых четко все написано, не могу понять почему не работает. кстате у меня вин7, мб с этим связано
http://wm-help.net/books-online/book/59464/59464-22.html
http://support.microsoft.com/kb/150523
У кого было чтото подобное подскажите
You should not use DuplicateHandle to duplicate handles to ... sockets.
To duplicate a socket handle, use the WSADuplicateSocket function.
[/QUOTE]
Источник.
http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx) и я зделал вывод что сокет acept продублирывать не получится. тогда я нашел разные статьи в которых говорится про Duplicatehandle. я канечно могу ошибатся, тогда подскажите пожалуйста как правильно сделать.
этот вариант я пробовал первым делом, но не удавалось создать сокет с помощью структуры WSAPROTOCOL_INFO, во всех примерах которые я нашел дубликат создавался на основе сокета полученого функцией connect (на том же майкрософте есть алгоритм
Завтра днем набросаю пример, если будет еще актуально.
буду ждать, заренне спасибо
1 процесс
Код:
sClient = accept(sServerListen, (struct sockaddr*) & clientaddr,&nSize);
ZeroMemory(&si, sizeof(STARTUPINFO));
hUserProcess = CreateProcess("processproj.exe", NULL, NULL, NULL,FALSE, CREATE_SUSPENDED|CREATE_NEW_CONSOLE, config_block, NULL, &si, &pi);
WSADuplicateSocket(sClient , pi.dwProcessId,&info));
ResumeThread(pi.hThread);
ZeroMemory(&si, sizeof(STARTUPINFO));
hUserProcess = CreateProcess("processproj.exe", NULL, NULL, NULL,FALSE, CREATE_SUSPENDED|CREATE_NEW_CONSOLE, config_block, NULL, &si, &pi);
WSADuplicateSocket(sClient , pi.dwProcessId,&info));
ResumeThread(pi.hThread);
2 процесс
Код:
WSADATA wsd;
WSAStartup(MAKEWORD(2, 2), &wsd);
читаю структуру info через ReadProcessMemory (структура передается верно)
SOCKET sock = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
FROM_PROTOCOL_INFO, &info, 0, 0);
printf("%d", WSAGetLastError());
WSAStartup(MAKEWORD(2, 2), &wsd);
читаю структуру info через ReadProcessMemory (структура передается верно)
SOCKET sock = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
FROM_PROTOCOL_INFO, &info, 0, 0);
printf("%d", WSAGetLastError());
получаю 10106
Прошу прощения, что не ответил раньше, как пообещал, - был немного занят. :(
Вот - пример работы с WSADuplicateSocket(). Говорю сразу: с передачей WSAPROTOCOL_INFO между процессами не заморачивался, сделал через простейшую сериализацию объекта и передачу через внешний текстовый файлик; суть абсолютно не в этом. Основная логика работы, которая вас интересует, представлена в _tmain().
P.S. В реальной жизни структуру можно передать, например, либо через пайп, либо через ReadProcessMemory / WriteProcessMemory, как вы и делали.
спасибо Вам большое, только щас удалось запустить, и то только спомощью передачи через ваши функции. ReadProcessMemory отрабатывает без ошибок но с ней не работает. очень долго пробывал разные варианты, нашел в чем проблема, когда при создании процесса передавать массив с переменными окружения то не работает, если 0 то работает. завтра попробую передаь через командную строку или дописать в родительский блок и скажу.
Имейте в виду, что мой вариант по передаче структуры крайне неудачный, я это признаю и не отказываюсь от этого. :) Я его делал просто чтобы как-нибудь это реализовать.
все работает через командную строку. только вот интересно почему если я передаю отдельно путь к файлу и командную строку, первый аргумент теряется, а когда все пихаю в 1 строку и передаю как командную строку то все норм.
В каком плане - первый аргумент теряется? Покажите код и результаты, по возможности.
Возможно,дело в том,что передаются пробелы,не заключённые в кавычки.Об этом читаем в ремарках к CreateProcess
Код:
char config_block[64];
char name[512] ="C:\\Users\\Администратор\\Documents\\RAD Studio\\Projects\\Debug\\processproj.exe";
StringCchPrintf(config_block, 64, "%d %d %d", pID, i, pTable);
CreateProcess(name, config_block, NULL, NULL, FALSE,CREATE_SUSPENDED | CREATE_NEW_CONSOLE, 0, NULL, &si, &pi);
char name[512] ="C:\\Users\\Администратор\\Documents\\RAD Studio\\Projects\\Debug\\processproj.exe";
StringCchPrintf(config_block, 64, "%d %d %d", pID, i, pTable);
CreateProcess(name, config_block, NULL, NULL, FALSE,CREATE_SUSPENDED | CREATE_NEW_CONSOLE, 0, NULL, &si, &pi);
теперь смотрю что передается
Код:
_tprintf(_T("%d %s %s %s %s"),argc,argv[0],argv[1],argv[2],argv[3]);
3 C:\Users\└фьшэшёЄЁрЄюЁ\Documents\RAD Studio\Projects\Debug\processproj.exe 0
2146566164 (null)
0 и 2146566164 это параметры i и pTable соотвественно, а pID как будто не передается ввобще
если делаю 1 строкой и путь и параметры то все норм
Код:
StringCchPrintf(config_block, 64, " %d %d %d", pID, i, pTable);
StringCchCat(name, 512, config_block);
CreateProcess(0, name, NULL, NULL, FALSE,
CREATE_SUSPENDED | CREATE_NEW_CONSOLE, 0, NULL, &si, &pi);
StringCchCat(name, 512, config_block);
CreateProcess(0, name, NULL, NULL, FALSE,
CREATE_SUSPENDED | CREATE_NEW_CONSOLE, 0, NULL, &si, &pi);
это конечно не принципиально, но все же интересно почему 1 вариант не работает
Во-первых, если используете TCHAR, используйте его везде (я про переменные name и т.п.). Во-вторых, попробуйте действительно с кавычками поиграться.
я почитал что там майкрософты пишут, что если есть в пути пробел то нужно через командную строку, тем более так и работает. Ладно спс всем за помощь, главное что с сокетами все работает.