На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

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



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz