Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дублирование сокета

6.8K
25 октября 2011 года
bolt90
80 / / 25.01.2007
Здравствуйте. У меня возникла проблема с дублирование сокета. В 1 процессе создается сокет
 
Код:
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
У кого было чтото подобное подскажите
278
25 октября 2011 года
Alexander92
1.1K / / 04.08.2008
[QUOTE=MSDN]
You should not use DuplicateHandle to duplicate handles to ... sockets.
To duplicate a socket handle, use the WSADuplicateSocket function.
[/QUOTE]

Источник.
6.8K
25 октября 2011 года
bolt90
80 / / 25.01.2007
этот вариант я пробовал первым делом, но не удавалось создать сокет с помощью структуры WSAPROTOCOL_INFO, во всех примерах которые я нашел дубликат создавался на основе сокета полученого функцией connect (на том же майкрософте есть алгоритм http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx) и я зделал вывод что сокет acept продублирывать не получится. тогда я нашел разные статьи в которых говорится про Duplicatehandle. я канечно могу ошибатся, тогда подскажите пожалуйста как правильно сделать.
278
26 октября 2011 года
Alexander92
1.1K / / 04.08.2008
Завтра днем набросаю пример, если будет еще актуально.
6.8K
26 октября 2011 года
bolt90
80 / / 25.01.2007
буду ждать, заренне спасибо
6.8K
28 октября 2011 года
bolt90
80 / / 25.01.2007
Вот так не работает тоже
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);

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());

получаю 10106
278
28 октября 2011 года
Alexander92
1.1K / / 04.08.2008
[ATTACH]5385[/ATTACH]

Прошу прощения, что не ответил раньше, как пообещал, - был немного занят. :(
Вот - пример работы с WSADuplicateSocket(). Говорю сразу: с передачей WSAPROTOCOL_INFO между процессами не заморачивался, сделал через простейшую сериализацию объекта и передачу через внешний текстовый файлик; суть абсолютно не в этом. Основная логика работы, которая вас интересует, представлена в _tmain().

P.S. В реальной жизни структуру можно передать, например, либо через пайп, либо через ReadProcessMemory / WriteProcessMemory, как вы и делали.
6.8K
28 октября 2011 года
bolt90
80 / / 25.01.2007
спасибо Вам большое, только щас удалось запустить, и то только спомощью передачи через ваши функции. ReadProcessMemory отрабатывает без ошибок но с ней не работает. очень долго пробывал разные варианты, нашел в чем проблема, когда при создании процесса передавать массив с переменными окружения то не работает, если 0 то работает. завтра попробую передаь через командную строку или дописать в родительский блок и скажу.
278
28 октября 2011 года
Alexander92
1.1K / / 04.08.2008
Имейте в виду, что мой вариант по передаче структуры крайне неудачный, я это признаю и не отказываюсь от этого. :) Я его делал просто чтобы как-нибудь это реализовать.
6.8K
29 октября 2011 года
bolt90
80 / / 25.01.2007
все работает через командную строку. только вот интересно почему если я передаю отдельно путь к файлу и командную строку, первый аргумент теряется, а когда все пихаю в 1 строку и передаю как командную строку то все норм.
278
29 октября 2011 года
Alexander92
1.1K / / 04.08.2008
В каком плане - первый аргумент теряется? Покажите код и результаты, по возможности.
7
29 октября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Возможно,дело в том,что передаются пробелы,не заключённые в кавычки.Об этом читаем в ремарках к CreateProcess
6.8K
30 октября 2011 года
bolt90
80 / / 25.01.2007
 
Код:
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);

теперь смотрю что передается
 
Код:
_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);

это конечно не принципиально, но все же интересно почему 1 вариант не работает
278
30 октября 2011 года
Alexander92
1.1K / / 04.08.2008
Во-первых, если используете TCHAR, используйте его везде (я про переменные name и т.п.). Во-вторых, попробуйте действительно с кавычками поиграться.
6.8K
31 октября 2011 года
bolt90
80 / / 25.01.2007
я почитал что там майкрософты пишут, что если есть в пути пробел то нужно через командную строку, тем более так и работает. Ладно спс всем за помощь, главное что с сокетами все работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог