На главную

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 | Скачать Вниз

Transactions on Named Pipes



A named pipe transaction is a client-server communication that combines a write operation and a read operation into a single network operation. A transaction can be used only on a duplex, message-type pipe. Transactions improve the performance of network communications between a client and a remote server. Processes can use the TransactNamedPipe and CallNamedPipe functions to perform named pipe transactions.

TransactNamedPipe is typically used by a client process to write a request message to the named pipe server and read the server's response message. The client process must specify GENERIC_READ | GENERIC_WRITE access when it opens its pipe handle by calling the CreateFile function. Then, the client process sets the pipe handle to message-read mode by calling the SetNamedPipeHandleState function. If the read buffer specified in the call to TransactNamedPipe is not large enough to hold the entire message written by the server, the function returns FALSE and GetLastError returns ERROR_MORE_DATA. The client can read the remainder of the message by calling either the ReadFile, ReadFileEx, or PeekNamedPipe function.

TransactNamedPipe is typically called by client processes, but can also be used by a server process.
The following example shows a client process using TransactNamedPipe. The example assumes that the client process has used CreateFile to connect to the pipe and SetNamedPipeHandleState to set the pipe handle's read mode, as shown in the client process example in the preceding section.

fSuccess = TransactNamedPipe(
hPipe, // pipe handle
lpszWrite, // message to server
strlen(lpszWrite)+1, // message length
chReadBuf, // buffer to receive reply
512, // size of read buffer
&cbRead, // number of bytes read
NULL); // not overlapped

// Exit if an error occurs, unless the error indicates there is more
// data in the message.

if (!fSuccess && (GetLastError() != ERROR_MORE_DATA))

MyErrExit("TransactNamedPipe");

while(1)
{
// Data from the pipe is written to STDOUT.

if (! WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
chReadBuf, cbRead, &cbWritten, NULL) )
break;

// Break if TransactNamedPipe or ReadFile is successful.

if (fSuccess)
break;

// Read from the pipe if there is more data in the message.

fSuccess = ReadFile(
hPipe, // pipe handle
chReadBuf, // buffer to receive reply

512, // size of buffer
&cbRead, // number of bytes read
NULL); // not overlapped

// Exit if an error other than ERROR_MORE_DATA occurs.

if (! fSuccess && (GetLastError() != ERROR_MORE_DATA))
break;
}


A client process uses CallNamedPipe to combine calling the CreateFile, WaitNamedPipe (if necessary), TransactNamedPipe, and CloseHandle function into a single call. Because the pipe handle is closed before the function returns, any additional bytes in the message are lost if the message is larger than the specified size of the read buffer. The following example shows the use of CallNamedPipe.

// Combines connect, wait, write, read, and close operations.

fSuccess = CallNamedPipe(
lpszPipename, // pipe name
lpszWrite, // message to server
strlen(lpszWrite)+1, // message length
chReadBuf, // buffer to receive reply
512, // size of read buffer
&cbRead, // number of bytes read
20000); // waits for 20 seconds

if (fSuccess || GetLastError() == ERROR_MORE_DATA)

{

// Data from the pipe is written to STDOUT.

WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
chReadBuf, cbRead, &cbWritten, NULL);

// The pipe is closed, so no more bytes can be read from the
// message.

if (! fSuccess)
printf("\n...extra data in message was lost\n");
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Сделки в Поименованных Трубах



Поименованная сделка трубы является клиентом-сервером связи, который объединяет записывать операцию и операция чтения на единственную сетевую операцию. Сделка может использоваться только в сообщении-типе дуплекса, трубы. Сделки улучшают исполнению сетевой связи между клиентом и дистанционный сервер. Процессы могут использовать TransactNamedPipe и функции CallNamedPipe, чтобы выполнять поименованные сделки трубы.

TransactNamedPipe ОБЫЧНО использован процессом клиента, чтобы записывать запрос сообщение в поименованный сервер трубы и читать сообщение ответа сервера. Процесс клиента должен определить GENERIC_READ | доступ GENERIC_WRITE когда он открывает свою ручку трубы вызывая функцию CreateFile. Затем, процесс клиента устанавливает ручку трубы в сообщение-прочитавшее режим вызывая функцию SetNamedPipeHandleState. Если буфер чтения определенный на вызове на TransactNamedPipe - не большой достаточно, чтобы держать целое сообщение записанное сервером, функция возвращает ЛОЖЬ и возврат GetLastError ERROR_MORE_DATA. Клиент может прочитать разность сообщения вызывая также ReadFile, ReadFileEx, или функция PeekNamedPipe.

TransactNamedPipe ОБЫЧНО вызван процессами клиента, но может также использован процессом сервера.
Следующий пример показывает процесс клиента, использовавший TransactNamedPipe. Пример допускает что процесс клиента использовал CreateFile, чтобы подключать к трубе и SetNamedPipeHandleState, чтобы устанавливать трубу оперировать прочитавшее режим, как показано в примере процесса клиента в предыдущей секции.

fSuccess = TransactNamedPipe( hPipe, // Ручка трубы lpszWrite, // сообщение в сервер strlen(lpszWrite)+1, // длина сообщения chReadBuf, // буфер, чтобы получать ответу 512, // размер буфера чтения &cbRead, // количество байтов было прочитано НЕДЕЙСТВИТЕЛЬНЫМ); // не перекрытое

// Выход если ошибка происходит, если ошибка не указывает есть более // данные в сообщении.

если (!fSuccess && (GetLastError() != ERROR_MORE_DATA))

MyErrExit("TransactNamedPipe");

пока(1)
{
// Данные из трубы записаны на STDOUT.

если (! WriteFile ПРЕРЫВАНИЯ(GetStdHandle(STD_OUTPUT_HANDLE), chReadBuf, cbRead, &cbWritten, НЕДЕЙСТВИТЕЛЬНОЕ) );

// Прерывание если TransactNamedPipe или ReadFile имеет успех.

если прерывание (fSuccess);

// Прочитанное из трубы если есть более данные в сообщении.

fSuccess = ReadFile( hPipe, // Ручка трубы chReadBuf, // буфер, чтобы получать ответ

512, // размер буфера &cbRead, // количество байтов было прочитано НЕДЕЙСТВИТЕЛЬНЫМ); // не перекрытое

// Выход если ошибка кроме ERROR_MORE_DATA происходит.

если (! fSuccess && Прерывание (GetLastError() != ERROR_MORE_DATA));
}


Процесс клиента использует CallNamedPipe, чтобы объединять вызывая CreateFile, WaitNamedPipe (если необходимый), TransactNamedPipe, и функция CloseHandle на единственный вызов. Поскольку ручка трубы закрыта прежде, чем функция возвращается, любые дополнительные байты в сообщении потерены если сообщение большее чем определенный размер буфера чтения. Следующий пример показывает использование CallNamedPipe.

// Комбайны соединяют, ожидаются, запись, была прочитана, и закрытые операции.

fSuccess = CallNamedPipe( lpszPipename, // Имя трубы lpszWrite, // сообщение в сервер strlen(lpszWrite)+1, // длина сообщения chReadBuf, // буфер, чтобы получать ответу 512, // размер буфера чтения &cbRead, // количество байтов было прочитано 20000); // ожидания 20 секунд

если (fSuccess || GetLastError() == ERROR_MORE_DATA)

{

// Данные из трубы записаны на STDOUT.

WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), chReadBuf, cbRead, &cbWritten, НЕДЕЙСТВИТЕЛЬНОЕ);

// Труба закрыта, так что больше байты не могут быть прочитаны из // сообщения.

если (! fSuccess)
printf("\n...дополнительные данные в сообщении было lost\n");
}



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