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

  • Автор темы Firefox
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

Firefox

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