Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

PIPE каналы   Найти похожие ветки 

 
ATarget ©   (2005-05-23 20:31) [0]

Как на Delphi работать с PIPE каналами, создание канала, запись, чтение ):-( чето они совсем немонятные


 
Fay ©   (2005-05-23 21:02) [1]

Multithreaded Pipe Server
The following example is a multithreaded pipe server. It has a main thread with a loop that creates a pipe instance and waits for a pipe client to connect. When a pipe client connects, the pipe server creates a thread to service that client and then continues to execute the loop. It is possible for a pipe client to connect successfully to the pipe instance in the interval between calls to the CreateNamedPipe and ConnectNamedPipe functions. If this happens, ConnectNamedPipe returns zero, 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 pipe client closes its handle. When this happens, the thread flushes the pipe, disconnects, closes its pipe handle, and terminates.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

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 a nonzero value. If the function returns
     // zero, 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 == NULL)
           MyErrExit("CreateThread");
        else
           CloseHandle(hThread);

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


 
VMcL ©   (2005-05-23 21:50) [2]

http://www.delphimaster.ru/articles/named_pipes/index.html


 
ATarget ©   (2005-05-25 15:54) [3]

Спасибо :)


 
Alex Konshin ©   (2005-05-26 03:36) [4]

У меня на сайте в примере MSSQLAlert используются NamedPipes, там и класс есть соответствующий.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.01 c
14-1124298671
lookin
2005-08-17 21:11
2005.09.11
Подсветка синтаксиса в Delphi6


1-1124301886
злобная танька
2005-08-17 22:04
2005.09.11
ООП: обмен методами


1-1124651679
Gamer
2005-08-21 23:14
2005.09.11
PopupMenu нестандартной формы


4-1121874756
Still Swamp
2005-07-20 19:52
2005.09.11
Нужно сдлеать LogOff пользов XP после завершения работы программы


14-1124216995
rts111
2005-08-16 22:29
2005.09.11
Test





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский