1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

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

    Firefox Гость

    Репутация:
    0
    Здравствуйте. разбираюсь сейчас с именоваными каналами на одной компьютере. надо чтоб они работали в асинхронном режиме, чтоб не грузить основной процесс программы куда будут подключаться файды сервера и клиента для создания канала. не происходит коннекта. если в синхронном режиме делать то все коннектиться но и программа виснет.
    вот что получилось:
    Код:
    // СЕРВЕР
    //.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();
    //
    помогите пожалуйста ато нет мыслей уже почему коннекта не происходит.
     
Загрузка...
Статус темы:
Закрыта.

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