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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.