именованые каналы

Тема в разделе "Другие", создана пользователем Firefox, 20 июл 2011.

Статус темы:
Закрыта.
  1. Firefox

    Firefox Гость

    Здравствуйте. разбираюсь сейчас с именоваными каналами на одной компьютере. надо чтоб они работали в асинхронном режиме, чтоб не грузить основной процесс программы куда будут подключаться файды сервера и клиента для создания канала. не происходит коннекта. если в синхронном режиме делать то все коннектиться но и программа виснет.
    вот что получилось:
    Код (C++):
    // СЕРВЕР
    //.h
    #include <QtGui/QMainWindow>
    #include "ui_server_pipe.h"
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <QTimer>
    #include <QString>
    #include <QThread>
    class channel: public QThread {
    Q_OBJECT
    public:
    channel();
    ~channel();
    QTimer *tpipe;
    OVERLAPPED StrOverlapp;
    //Ui_server_pipeClass uicl;
    void run();
    void createChannel();
    void writeChannel();
    private slots:
    void readChannel();


    };
    //.cpp
    #include "channel.h"


    QString str;
    // Флаг успешного создания канала
    BOOL  fConnected;
    // Идентификатор события
    HANDLE hEvent;

    // Идентификатор канала Pipe
    HANDLE hNamedPipe;

    // Имя создаваемого канала Pipe
    LPCTSTR lpszPipeName =L"\\\\.\\pipe\\$MyPipe$";

    // Буфер для передачи данных через канал
    char  szBuf[512];

    // Количество байт данных, принятых через канал
    DWORD cbRead;
    // Количество байт данных, переданных через канал
    DWORD cbWritten;
    bool flag=0,flag_exit=0;

    Ui_server_pipeClass uicl;
    channel::channel()
    {

    }
    channel::~channel()
    {
    DisconnectNamedPipe(hNamedPipe);
    CloseHandle(hNamedPipe);
    }
    void channel::createChannel()
    {

    hEvent=CreateEvent(NULL,FALSE,FALSE, NULL);
    StrOverlapp.hEvent=hEvent;
    StrOverlapp.Offset=0; // TRANSFER HANDLE TEST >!
    StrOverlapp.OffsetHigh=0;

    while(!hNamedPipe)
    {
    // Создаем канал Pipe, имеющий имя lpszPipeName
    hNamedPipe = CreateNamedPipe(
    lpszPipeName, // имя канала.
    PIPE_ACCESS_DUPLEX |FILE_FLAG_OVERLAPPED , /*асинхрон*/
    PIPE_TYPE_MESSAGE,
    10, // максимальное количество экземпляров канала.
    512, // размер выходного буфера по умолчанию.
    512, // рахмер входного буфера по умолчанию.
    INFINITE, // клиент ждет связь бесконечно долго.
    NULL // безопасность по умолчанию.
    );

    // Если возникла ошибка, выводим ее код и завершаем
    // работу приложения
    if(hNamedPipe == INVALID_HANDLE_VALUE)
    {
    str+="CreateNamedPipe: Error %ld\n"+GetLastError();
    fprintf(stdout,"CreateNamedPipe: Error %ld\n",
    GetLastError());
    }
    }
    // Выводим сообщение о начале процесса создания канала
    str+="Waiting for connect...\n";
    fprintf(stdout,"Waiting for connect...\n");
    tpipe->start(50);
    exec();
    }
    void channel::readChannel()
    {
    bool flag_read=false;
    if(!fConnected)
    // Ожидаем соединения со стороны клиента
    fConnected = ConnectNamedPipe(hNamedPipe, &StrOverlapp);

    // При возникновении ошибки выводим ее код
    if(!fConnected)
    {
    flag_read=1;
    }


    // Цикл получения команд через канал
    if(flag_read==false)
    {
    // Выводим сообщение об успешном создании канала
    fprintf(stdout,"\nConnected. Waiting for command...\n");
    QString last_command="";
    // Получаем очередную команду через канал Pipe
    if(ReadFile(hNamedPipe, szBuf, sizeof(szBuf), &cbRead, NULL))
    {
    for (int i=0;i<512 && szBuf[i]!='\0';i++)
    {
    str+=szBuf[i];
    last_command+=szBuf[i];

    }
    fprintf(stdout,/*"Received:\n"*/szBuf);

    if(last_command=="exit")
    {
    exit();
    flag_exit=1;
    }
    else flag_exit=0;
    }
    else
    {
    fprintf(stdout,"ReadFile: Error %ld\n #330033", GetLastError());
    getch();
    }  
    if(flag_exit==1)
    {
    szBuf[0]='c';
    szBuf[1]='l';
    szBuf[2]='o';
    szBuf[3]='s';
    szBuf[4]='e';
    for (int i=5;i<512;i++) szBuf[i]='\0';
    WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1,&cbWritten, NULL);
    }
    }
    }
    void channel::run()
    {
    tpipe= new QTimer();
    connect(tpipe,SIGNAL(timeout()),SLOT(readChannel()));
    createChannel();         
    }

    // запуск из главного потока:
    ch=new channel();
    ch->start(QThread::HighPriority);


    //КЛИЕНТ
    //.h
    #include <QString>
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <QTimer>
    #include <QThread>

    class chanel_pipe: public QThread
    {
    Q_OBJECT
    public:
    chanel_pipe();
    ~chanel_pipe();
    QTimer *Ttime;
    OVERLAPPED OVL;
    void run();
    bool read_chanel();
    void write_chanel(char string_ch[20]);

    protected:
    private slots:
    void slot_read();
    }; //.cpp
    #include "chanel_pipe.h"

    // Идентификатор канала Pipe
    HANDLE hNamedPipe;
    // Идентификатор события
    HANDLE hEndWrite;
    // Количество байт, переданных через канал
    DWORD cbWritten;

    // Количество байт, принятых через канал
    DWORD cbRead;

    // Буфер для передачи данных
    char  szBuf[256];

    chanel_pipe::chanel_pipe()
    {

    }
    chanel_pipe::~chanel_pipe()
    {

    }
    bool chanel_pipe::read_chanel()
    {
    if(!hNamedPipe)
    {
    // Создаем канал с процессом PIPES
    hNamedPipe = CreateFile(
    L"\\\\.\\pipe\\$MyPipe$", GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING, 0, NULL);

    // Если возникла ошибка, выводим ее код и
    // завершаем работу приложения
    if(hNamedPipe == INVALID_HANDLE_VALUE)
    {
    fprintf(stdout,"CreateFile: Error %ld\n",
    GetLastError());
    getch();
    }
    }

    bool rez=ReadFile(hNamedPipe, szBuf, strlen(szBuf)+1, &cbRead, NULL);
    QString str;
    for(int i=0;i<512;i++)str=str+szBuf[i];
    if(str=="exit")
    {
    return 0;
    }
    return 1;
    }
    void chanel_pipe::write_chanel(char string_ch[20])
    {
    if(!hNamedPipe)
    {
    // Создаем канал с процессом PIPES
    hNamedPipe = CreateFile(
    L"\\\\.\\pipe\\$MyPipe$", GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING, 0, NULL);

    // Если возникла ошибка, выводим ее код и
    // завершаем работу приложения
    if(hNamedPipe == INVALID_HANDLE_VALUE)
    {
    fprintf(stdout,"CreateFile: Error %ld\n",
    GetLastError());
    //getch();
    }
    else
    WriteFile(hNamedPipe, string_ch, strlen(string_ch) + 1,
    &cbWritten, NULL); 
    }
    else
    WriteFile(hNamedPipe, string_ch, strlen(string_ch) + 1,
    &cbWritten, NULL); 
    }
    void chanel_pipe::slot_read()
    {
    bool rr=false;
    if(hNamedPipe)
    rr=read_chanel();
    }
    void chanel_pipe::run()
    {

    hEndWrite=CreateEvent(NULL,FALSE,FALSE,NULL);
    OVL.Offset=0;
    OVL.OffsetHigh=0;
    OVL.hEvent=hEndWrite;
    //bool PRezWait=WaitNamedPipe( L"\\\\.\\pipe\\$MyPipe$", NMPWAIT_WAIT_FOREVER );
    while(!hNamedPipe)
    {
    // Создаем канал с процессом PIPES
    hNamedPipe=CreateFile(
    L"\\\\.\\pipe\\$MyPipe$", GENERIC_READ | GENERIC_WRITE,
    0, NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);

    // Если возникла ошибка, выводим ее код и
    // завершаем работу приложения
    if(hNamedPipe == INVALID_HANDLE_VALUE)
    {
    fprintf(stdout,"CreateFile: Error %ld\n",
    GetLastError());


    }
    }
    Ttime=new QTimer;
    connect(Ttime,SIGNAL(timeout()),this,SLOT(slot_read()));
    Ttime->start(50);
    exec();
    }
    // запускаю из основного процесса
    ch_pipe=new chanel_pipe();
    ch_pipe->start();
    //
    помогите пожалуйста ато нет мыслей уже почему коннекта не происходит.
     
Загрузка...
Похожие Темы - именованые каналы
  1. Rolana
    Ответов:
    0
    Просмотров:
    883
Статус темы:
Закрыта.

Поделиться этой страницей