Pipe and LAN
От: _Shyrik_ Украина  
Дата: 02.12.10 09:59
Оценка: 5 (2)
Делается некий проект, состоящий из отдельных приложений и сервисов, связь между которыми организовывается посредством именованных Pipe.
Всё было чудосно, пока не проинсталировал на виртуалку для тесаового прогона. На виртуалке была отключена сетевуха — Pipe пересали работать
Грешил на компонент (проект нарисован на билвере с++6), на виртуалку — написал простенькое приложенице, где Pipe реализованы на API (имя пайпа задавал как "\\\\.\\Pipe\\MyPipe"), тестировал на
реальной и на виртуалке — результат: именованный Pipe не работает на машине с отключённой сетевухой!!! Почему такое может быть? Как только активирую
сетевуху — всё работает. Причём, опытным путём, было определено, что влияет сетевое подключение именно реального канала: на боевом коне имеется с пяток сетевых, оди из которых — ральный выход в сетку, вот только от онного и зависит работа/безделье Pipe.
Прошу помощи !!!
(при отключённой сети выдаёт такие ошибки: если компонент — ошибка доступа, если на API — 1231 "The network location cannot be reached...".
При чём тут сеть к пайпам — )
Re: Pipe and LAN
От: ononim  
Дата: 02.12.10 12:30
Оценка:
_S_>Всё было чудосно, пока не проинсталировал на виртуалку для тесаового прогона. На виртуалке была отключена сетевуха — Pipe пересали работать
_S_>Грешил на компонент (проект нарисован на билвере с++6), на виртуалку — написал простенькое приложенице, где Pipe реализованы на API (имя пайпа задавал как "\\\\.\\Pipe\\MyPipe"), тестировал на
Код покажите, в винде пайпы юзаются дофига где самой системой.
Имя пайпа задавали как "\\\\.\\Pipe\\MyPipe" в коде или октуда то извне? Ибо двойные слэши — это для С++, ибо искейпинг. А если вы в самом деле \\\\.\\Pipe\\MyPipe передали в CreateFile то система могла както хитро распарсить это дело, к примеру синтепретировав \\. как имя компа (начиная с двух слэшей) и пытаясь достучаться к нему по сети

_S_>При чём тут сеть к пайпам

При том что пайпы и по сети могут работать.
Как много веселых ребят, и все делают велосипед...
Pipe and LAN
От: Jolly Roger  
Дата: 02.12.10 13:02
Оценка: 37 (6)
#Имя: FAQ.winapi.pipeandlan
Здравствуйте, _Shyrik_, Вы писали:

здесь

When you run an application that uses named pipes as an Interprocess Communication (IPC) mechanism on a Windows NT computer without network support installed, it fails to connect to the named pipe resource either locally or remotely.
For remote named pipe resources, the system must have a physical network card installed. However, for local named pipe resources, you can install the MSLoopback adapter driver for support.


вот это должно помочь.

Установка оборудования — Сетевые платы — Адаптер Microsoft замыкания на себя.

После успешной установки адаптера необходимо настроить его конфигурацию. Поскольку адаптер не подключен к физическим устройствам, то в случае выбора в свойствах TCP/IP протокола DHCP фактически используется адрес автосети (169.254.x.x/16).


Скопипастил основное, чтоб далеко не ходить — Odi$$ey
"Нормальные герои всегда идут в обход!"
pipe
Re[2]: Pipe and LAN
От: _Shyrik_ Украина  
Дата: 02.12.10 14:21
Оценка:
Здравствуйте, ononim, Вы писали:

O>Код покажите, в винде пайпы юзаются дофига где самой системой.


Сервер:

//---------------------------------------------------------------------------
void ThrPippeServer::ServPipe(HWND hwnd)
{
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
HANDLE hPipe;
DWORD Error,BytesR;
static char Buf[100];
char Str[500],BufErr[120];

//Инициализация нового объекта sd для очистки значений
 if(!InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION)){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь инициализировать объект sd.\nОшибка %u: %s",Error,BufErr);
    MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
   return;
 };
// Присвоение полю DACL значение NULL
 if(!SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE)){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь установить поле DACL.\nОшибка %u: %s",Error,BufErr);
    MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
   return;
 };
 sa.nLength=sizeof(SECURITY_ATTRIBUTES);
 sa.lpSecurityDescriptor=&sd;
 sa.bInheritHandle=TRUE;

 hPipe=CreateNamedPipe("\\\\.\\Pipe\\MyPipe",PIPE_ACCESS_DUPLEX,
                                     PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,1,0,0,1000,&sa);
 if(hPipe==INVALID_HANDLE_VALUE) {
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь создать именованый канал.\nОшибка %u: %s",Error,BufErr);
    MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
   return;
 };
 MessageBox(hwnd,"Запустился.","Сервер",MB_SYSTEMMODAL|MB_OK);

 if(ConnectNamedPipe(hPipe,NULL)==0){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь слушать канал.\nОшибка %u: %s",Error,BufErr);;
     MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
    CloseHandle(hPipe);
   return;
 };
 if(!ReadFile(hPipe,Buf,1024,&BytesR,NULL)){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь получить данные.\nОшибка %u: %s",Error,BufErr);
    MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
    CloseHandle(hPipe);
   return;
 };
 sprintf(Str,"Получено %d байтов текста:\n %s\n",BytesR,Buf);
 MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);

 if(DisconnectNamedPipe(hPipe)==0){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь закрыть канал.\nОшибка %u: %s",Error,BufErr);
     MessageBox(hwnd,Str,"Сервер",MB_SYSTEMMODAL|MB_OK);
 };

 CloseHandle(hPipe);
}
//---------------------------------------------------------------------------


Клиент:


//---------------------------------------------------------------------------
void ThrPipeClient::ClientPipe(HWND hwnd)
{
HANDLE hPipe;
DWORD BytesW;
DWORD Error;
char Str[500],BufErr[120];

 if(!WaitNamedPipe("\\\\.\\Pipe\\MyPipe",NMPWAIT_WAIT_FOREVER)){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь обнаружить канал.\nОшибка %u: %s",Error,BufErr);
     MessageBox(hwnd,Str,"Клиент",MB_SYSTEMMODAL|MB_OK);
   return;
 };
 hPipe=CreateFile("\\\\127.0.0.1\\Pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,
             (LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hPipe==INVALID_HANDLE_VALUE){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь соединиться с каналом.\nОшибка %u: %s",Error,BufErr);;
     MessageBox(hwnd,Str,"Клиент",MB_SYSTEMMODAL|MB_OK);
   return;
 };
 if(!WriteFile(hPipe,"This is a test",14,&BytesW,NULL)){
     Error=GetLastError();
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
   sprintf(Str,"Затрудняюсь отправить данные.\nОшибка %u: %s",Error,BufErr);
     MessageBox(hwnd,Str,"Клиент",MB_SYSTEMMODAL|MB_OK);
   CloseHandle(hPipe);
   return;
 };
 sprintf(Str,"Отправлено %d байтов.",BytesW);
 MessageBox(hwnd,Str,"Клиент",MB_SYSTEMMODAL|MB_OK);
 CloseHandle(hPipe);
}
//---------------------------------------------------------------------------




O>Имя пайпа задавали как "\\\\.\\Pipe\\MyPipe" в коде или октуда то извне? Ибо двойные слэши — это для С++, ибо искейпинг. А если вы в самом деле \\\\.\\Pipe\\MyPipe передали в CreateFile то система могла както хитро распарсить это дело, к примеру синтепретировав \\. как имя компа (начиная с двух слэшей) и пытаясь достучаться к нему по сети


Двойные слеши — из-за того, что на Builder всё реализованно, типа экранирование спец-символа.
uilred
Re[3]: Pipe and LAN
От: ononim  
Дата: 02.12.10 14:27
Оценка: :)
_S_>//---------------------------------------------------------------------------
_S_>void ThrPipeClient::ClientPipe(HWND hwnd)
_S_>{
_S_>HANDLE hPipe;
_S_>DWORD BytesW;
_S_>DWORD Error;
_S_>char Str[500],BufErr[120];

_S_> if(!WaitNamedPipe("\\\\.\\Pipe\\MyPipe",NMPWAIT_WAIT_FOREVER)){

_S_> Error=GetLastError();
_S_> FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,Error,LANG_SYSTEM_DEFAULT,BufErr,120,NULL);
_S_> sprintf(Str,"Затрудняюсь обнаружить канал.\nОшибка %u: %s",Error,BufErr);
_S_> MessageBox(hwnd,Str,"Клиент",MB_SYSTEMMODAL|MB_OK);
_S_> return;
_S_> };
_S_> hPipe=CreateFile("\\\\127.0.0.1\\Pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,
_S_> (LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

ЧЗН? ------------------------^^^^^^^^^^^^^
Как много веселых ребят, и все делают велосипед...
Re[4]: Pipe and LAN
От: _Shyrik_ Украина  
Дата: 02.12.10 14:32
Оценка:
Здравствуйте, ononim, Вы писали:

_S_>> hPipe=CreateFile("\\\\127.0.0.1\\Pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,


это хвосты от тестирования разных вариантов, с \\.\\Pipe \\localhost\\Pipe и \\127.0.0.1\\Pipe (пробовал так как ping 127.0.0.1 без сетевухи проходит)
Re[2]: Pipe and LAN
От: _Shyrik_ Украина  
Дата: 02.12.10 14:33
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, _Shyrik_, Вы писали:


JR>здесь


JR>вот это должно помочь.


Спасибо! Помогло!
Re[5]: Pipe and LAN
От: _Shyrik_ Украина  
Дата: 02.12.10 15:22
Оценка:
Здравствуйте, _Shyrik_, Вы писали:

_S_>Здравствуйте, ononim, Вы писали:


_S_>>> hPipe=CreateFile("\\\\127.0.0.1\\Pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,


_S_> это хвосты от тестирования разных вариантов, с \\.\\Pipe \\localhost\\Pipe и \\127.0.0.1\\Pipe (пробовал так как ping 127.0.0.1 без сетевухи проходит)


наступил, не заметил — если поставить "\\.\\" работает !!!
Такое решение тоже пойдет, как и с виртуальной сетевой карточкой LoopBack.
Re[5]: Pipe and LAN
От: Jolly Roger  
Дата: 02.12.10 15:51
Оценка:
Здравствуйте, _Shyrik_, Вы писали:

_S_>(пробовал так как ping 127.0.0.1 без сетевухи проходит)


Зато UDP brodcast не работает. Ну это так, к слову пришлось
"Нормальные герои всегда идут в обход!"
Re[6]: Pipe and LAN
От: ononim  
Дата: 02.12.10 15:53
Оценка:
_S_>>>> hPipe=CreateFile("\\\\127.0.0.1\\Pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE,0,
_S_>> это хвосты от тестирования разных вариантов, с \\.\\Pipe \\localhost\\Pipe и \\127.0.0.1\\Pipe (пробовал так как ping 127.0.0.1 без сетевухи проходит)
_S_> наступил, не заметил — если поставить "\\.\\" работает !!!
То есть все хорошо и изначальная проблема отменяется?
Как много веселых ребят, и все делают велосипед...
Re[6]: Pipe and LAN
От: Jolly Roger  
Дата: 02.12.10 15:54
Оценка:
Здравствуйте, _Shyrik_, Вы писали:

_S_> наступил, не заметил — если поставить "\\.\\" работает !!!


Попробуйте на "свежей" виртуалке, до установки Loopback драйвера.
"Нормальные герои всегда идут в обход!"
Re[7]: Pipe and LAN
От: _Shyrik_ Украина  
Дата: 03.12.10 07:16
Оценка: 21 (2)
Здравствуйте, Jolly Roger, Вы писали:

JR>Попробуйте на "свежей" виртуалке, до установки Loopback драйвера.


Поставил чистую WinXP SP3, без апдейтов.
Результат тестирования:
1. Без LoopBack драйвера: пайпы работают только при условии, что и сервер и клиент создаються с именами "\\.\Pipe\SomePipeName",
в остальных случаях ошибки.
2. С установленным LoopBack драйвером: без перезагрузки работает только то, что указано в пункте 1. После перезагрузки — работет пункт 1 плюс:
если сервер создаётся как "\\localhost\Pipe\SomePipeName" — ошибка 52, "\\127.0.01\Pipe\SomePipeName" — ошибка 123 (оно, в принципе, было ожидаемо, так как нельзя создать сервер на удалённой машине).
Если сервер создаётся как "\\.\Pipe\SomePipeName" то клиент работает при таких
параметрах: "\\127.0.0.1\Pipe\SomePipeName" и "\\.\Pipe\SomePipeName". Если попытаться "\\localhost\Pipe\SomePipeName" — ошибка 52.

ЗЫ. Всем сенкс за оперативную помощь!
Re: Pipe and LAN
От: Bear Hunter Украина  
Дата: 10.12.10 16:10
Оценка:
Здравствуйте, Jolly Roger, Вы писали:
JR>

JR>Установка оборудования — Сетевые платы — Адаптер Microsoft замыкания на себя.

JR>После успешной установки адаптера необходимо настроить его конфигурацию. Поскольку адаптер не подключен к физическим устройствам, то в случае выбора в свойствах TCP/IP протокола DHCP фактически используется адрес автосети (169.254.x.x/16).


А есть то же самое только для микрофона?
Тоесть что нужно:

1. Запускаю аудио плеер и включаю проигрование аудио
2. Запускаю Рекордер и включаю запись

В результате аудио поток с проигрователя буде записан в рекордере.

Спасибо!
Re[2]: Pipe and LAN
От: Jolly Roger  
Дата: 11.12.10 03:26
Оценка: 1 (1)
Здравствуйте, Bear Hunter, Вы писали:

BH>А есть то же самое только для микрофона?


Соединить вход и выход верёвкой?

Можно, вероятно, создать соответствующий граф фильтров, в DirectX SDK даже входит утилита graphedt.exe для визуального построения таких графов. Лучше здесь спросите, я в этом не специалист, очень мягко говоря
"Нормальные герои всегда идут в обход!"
Re[3]: Pipe and LAN
От: Аноним  
Дата: 11.12.10 13:35
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Соединить вход и выход верёвкой?

Неа не выйдет
Очень часто приходится работать удаленно с серверами, которые стоят на других этажах..

JR>Можно, вероятно, создать соответствующий граф фильтров, в DirectX SDK даже входит утилита graphedt.exe для визуального построения таких графов. Лучше здесь спросите, я в этом не специалист, очень мягко говоря


Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.