|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Multithreaded Server
This example of a multithreaded server process has a main thread that loops continuously, creating a pipe instance and waiting for a client process to connect. When a client process connects, the server process creates a thread to service that client and the loop starts over. It is possible for a client process to connect successfully to the pipe instance in the interval between calls to the CreateNamedPipe and ConnectNamedPipe functions. If this happens, ConnectNamedPipe returns FALSE, and GetLastError returns ERROR_PIPE_CONNECTED.
The thread created to service each pipe instance reads requests from the pipe and writes replies to the pipe until the client process closes its handle. When this happens, the thread flushes the pipe, disconnects, closes its pipe handle, and terminates.
#include #include #include #include VOID InstanceThread(LPVOID); VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); int xx = 0; DWORD main(VOID) { BOOL fConnected; DWORD dwThreadId; HANDLE hPipe, hThread; LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; // The main loop creates an instance of the named pipe and // then waits for a client to connect to it. When the client // connects, a thread is created to handle communications
// with that client, and the loop is repeated. for (;;) { hPipe = CreateNamedPipe( lpszPipename, // pipe name PIPE_ACCESS_DUPLEX, // read/write access PIPE_TYPE_MESSAGE | // message type pipe PIPE_READMODE_MESSAGE | // message-read mode PIPE_WAIT, // blocking mode PIPE_UNLIMITED_INSTANCES, // max. instances BUFSIZE, // output buffer size
BUFSIZE, // input buffer size PIPE_TIMEOUT, // client time-out NULL); // no security attribute if (hPipe == INVALID_HANDLE_VALUE) MyErrExit("CreatePipe"); // Wait for the client to connect; if it succeeds, // the function returns TRUE. If the function returns FALSE, // GetLastError returns ERROR_PIPE_CONNECTED. fConnected = ConnectNamedPipe(hPipe, NULL) ?
TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { // Create a thread for this client. hThread = CreateThread( NULL, // No security attribute 0, // Default stack size (LPTHREAD_START_ROUTINE) InstanceThread, (LPVOID) hPipe, // Thread parameter 0, // Not suspended &dwThreadId); // Returns thread ID
if (hThread == INVALID_HANDLE_VALUE) MyErrExit("CreateThread"); } else // The client could not connect, so close the pipe. CloseHandle(hPipe); } return 1; } VOID InstanceThread(LPVOID lpvParam) { CHAR chRequest[BUFSIZE]; CHAR chReply[BUFSIZE]; DWORD cbBytesRead, cbReplyBytes, cbWritten; BOOL fSuccess; HANDLE hPipe; // The thread's parameter is a handle to a pipe instance.
hPipe = (HANDLE) lpvParam; while (1) { // Read client requests from the pipe. fSuccess = ReadFile( hPipe, // handle to pipe chRequest, // buffer to receive data BUFSIZE, // size of buffer &cbBytesRead, // number of bytes read NULL); // not overlapped I/O if (! fSuccess || cbBytesRead == 0) break; GetAnswerToRequest(chRequest, chReply, &cbReplyBytes);
// Write the reply to the pipe. fSuccess = WriteFile( hPipe, // handle to pipe chReply, // buffer to write from cbReplyBytes, // number of bytes to write &cbWritten, // number of bytes written NULL); // not overlapped I/O if (! fSuccess || cbReplyBytes != cbWritten) break; } // Flush the pipe to allow the client to read the pipe's contents // before disconnecting. Then disconnect the pipe, and close the
// handle to this pipe instance. FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Сервер Multithreaded
Этот пример multithreaded процесса сервера имеет основную резьбу, которая зацикливает непрерывно, создавая пример трубы и ждя процесс клиента, чтобы соединяться. Когда процесс клиента соединяется, процесс сервера создает резьбу, чтобы обслуживать, который клиент и цикл начинает. Возможно для процесса клиента подключать успешно к примеру трубы в интервале между вызовами в CreateNamedPipe и функции ConnectNamedPipe. Если это случается, ЛОЖЬ возврата ConnectNamedPipe, и возврат GetLastError ERROR_PIPE_CONNECTED.
Резьба созданная, чтобы обслуживать каждую трубу, пример читает запросы из трубы и записывает ответы в трубу пока процесс клиента не закроет свою ручку. Когда это случается, резьба сбрасывает трубу, разъединяется, закрывает свою ручку трубы, и завершается.
#include #include #include #include АННУЛИРУЙТЕ InstanceThread(LPVOID); АННУЛИРУЙТЕ GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); int xx = 0; ОСНОВА DWORD(ПУСТОТА) { BOOL fConnected; DWORD dwThreadId; ПРООПЕРИРУЙТЕ hPipe, hThread; LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; // Основной цикл создает пример поименованной трубы и // затем ждет клиента, чтобы подключать к этому. Когда клиент // соединяется, резьба создана, чтобы оперировать связь
// с этим клиентом, и цикл повторен. для (;;) { hPipe = CreateNamedPipe( lpszPipename, // Имя трубы PIPE_ACCESS_DUPLEX, // прочитавшее/доступ записи PIPE_TYPE_MESSAGE | // труба типа сообщения PIPE_READMODE_MESSAGE | // сообщение-было прочитано режим PIPE_WAIT, // блокировка режима PIPE_UNLIMITED_INSTANCES, // max. примеров BUFSIZE, // выходного буферного размера
BUFSIZE, // ВХОДНОЙ буферный размер PIPE_TIMEOUT, // задержка клиента НЕДЕЙСТВИТЕЛЬНЫЙ); // никакой атрибут безопасности если (hPipe == INVALID_HANDLE_VALUE) MyErrExit("CreatePipe"); // Ожидание клиент, чтобы соединяться; если это получает, // функция возвращает ИСТИНУ. Если функция возвращает ЛОЖЬ, // возврат GetLastError ERROR_PIPE_CONNECTED. fConnected = ConnectNamedPipe(hPipe, НЕДЕЙСТВИТЕЛЬНЫЙ)?
ИСТИНА : (GetLastError() == ERROR_PIPE_CONNECTED); если (fConnected) { // Создайте резьбу для этого клиента. hThread = CreateThread( НЕДЕЙСТВИТЕЛЬНЫЙ, // атрибут No безопасности 0, // размер стека Умолчания (LPTHREAD_START_ROUTINE) InstanceThread, (LPVOID) hPipe, // параметр Резьбы 0, // Не приостановленное &dwThreadId); // Возврат заправляет ID
если (hThread == INVALID_HANDLE_VALUE) MyErrExit("CreateThread"); } еще // Клиент не мог соединяться, так что закрытие труба. CloseHandle(hPipe); } возврат 1; } ПУСТОТА InstanceThread(LPVOID lpvParam) { СИМВОЛ chRequest[BUFSIZE]; СИМВОЛ chReply[BUFSIZE]; DWORD cbBytesRead, cbReplyBytes, cbWritten; BOOL fSuccess; ПРООПЕРИРУЙТЕ hPipe; // Параметр резьбы является ручкой в пример трубы.
hPipe = (РУЧКА) lpvParam; пока (1) { // Прочитанный клиент запрашивается из трубы. fSuccess = ReadFile( hPipe, // Ручка в трубу chRequest, // буфер, чтобы получать данные BUFSIZE, // размер буфера &cbBytesRead, // количество байтов было прочитано НЕДЕЙСТВИТЕЛЬНЫМ); // не перекрывшее В/В если (! fSuccess || cbBytesRead == 0) Прерывание; GetAnswerToRequest(chRequest, chReply, &cbReplyBytes);
// Запишите ответ в трубу. fSuccess = WriteFile( hPipe, // Ручка в трубу chReply, // буфер, чтобы записываться из cbReplyBytes, // количества байтов, чтобы запись &cbWritten, // количество байтов записавших НЕДЕЙСТВИТЕЛЬНЫМИ); // не перекрывшее В/В если (! fSuccess || cbReplyBytes != cbWritten) Прерывание; } // Краска труба, чтобы позволять клиента, чтобы читать содержание / трубу/ перед отключением. Затем разъедините трубу и закрывайте the
// ручка в этот пример трубы. FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); }
|
|
|
|
| |