А в клиенте надо указать какие-то параметры, указывающие на то, что необходимо работать в неблокирующем режиме? У меня почему-то функция ReadFile всё ещё бесконечно ждёт ответа сервера.
Сервер:
| Код | ... void __fastcall TMonPipe::Execute() { char pBuf[BufSize]; unsigned long cbRead; hPipe = CreateNamedPipe("\\\\.\\pipe\\$MonitorPipe$",PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT, 1, BufSize, BufSize, 1000, NULL); if(hPipe==INVALID_HANDLE_VALUE) { ErrorMessage="Не удалось открыть канал взаимодействия приложений."; Synchronize(CallShowMessageFunction); return; } while(!Terminated) { UpdCapt="Нет коннекта"; Synchronize(UpdateCaption); //if(ConnectNamedPipe(hPipe, NULL)) ConnectNamedPipe(hPipe, NULL); if(GetLastError()==ERROR_PIPE_CONNECTED) { UpdCapt="Есть коннект"; Synchronize(UpdateCaption); while(!Terminated) { if(ReadFile(hPipe, pBuf, BufSize, &cbRead, NULL)) { if(AnsiString(pBuf)=="Test") SendMessage("Test - Ok");
} else if(GetLastError()!=ERROR_NO_DATA) { DisconnectNamedPipe(hPipe); break; } Sleep(50); } } Sleep(50); //CloseHandle(hPipe); } }
void __fastcall TMonPipe::SendMessage(AnsiString S) { unsigned long cbWritten; WriteFile(hPipe, S.c_str(), S.Length()+1,&cbWritten, NULL); } ...
|
Клиент:
| Код | ... hPipe = CreateFile( "\\\\192.168.0.4\\pipe\\$MonitorPipe$", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hPipe==INVALID_HANDLE_VALUE) { Application->MessageBoxA("Ошибка открытия канала","Ошибка",MB_ICONERROR); return; } ... char szBuf[512]; unsigned long cbRead; WriteFile(hPipe, Edit1->Text.c_str(), Edit1->Text.Length()+1, &cbWritten, NULL); int counter; counter=0; while(1) { counter++; if(ReadFile(hPipe, szBuf, 128, &cbRead, NULL)) { Memo1->Lines->Add("Принято:"+AnsiString(szBuf)); break; } if(szBuf==0 && counter<20) {Sleep(50); continue;} else {Memo1->Lines->Add("Выход по таймауту");break;} } ...
|
|