Проблема с именованными каналами (pipe)

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

FanJuS

#1
Всем привет! Помогите пожалуйсто программа Pipe (именованные каналы) не работает. Не пойму в чём ошибка :), всё запускается, но соединения нет :(

Часть первая - сервер.

Код:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdio.h> 
int _cdecl main(void)
{
//Создание именованого канала
HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\PipeSvr", //имя канала 
PIPE_ACCESS_DUPLEX | WRITE_DAC, //запись и чтение 
PIPE_TYPE_BYTE, // данные записываются как поток байтов
PIPE_UNLIMITED_INSTANCES,  // Неограниченное количество подключений
0, // Размеры буферов по умолчанию
0, 
NMPWAIT_WAIT_FOREVER, // Ожидать процесс будет бесконечно
NULL); // Атрибуты безопасности по умолчанию
if(hPipe==INVALID_HANDLE_VALUE) //если ошибка
{
printf("Failed to create named pipe...");
return(GetLastError());
} 
// Подключение
ConnectNamedPipe(
hPipe, // Дескриптор канала
NULL // Перекрытие не используем
);
DWORD lpBuf;
char cName[100]; 
ZeroMemory(&cName[0],sizeof(cName));
strcpy(&cName[0],"Hello world!"); 
WriteFile(
hPipe, // Дескриптор канала
&cName, // Указатель на массив записываемых байтов
sizeof(cName), // Куда поместить реально записанное количество
&lpBuf,NULL // Перекрытие не используем
);
DisconnectNamedPipe(hPipe);// разоединение соединения
CloseHandle(hPipe);
return(0); 
}
Часть вторая - клиент.

Код:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <stdio.h>
int _cdecl main(void)
{
printf("Enter pipe name please:\n");
char pName[100];
char str[100];
char str1[100];
ZeroMemory(
&str1[0],//Указатель на начало блока, который будет обнулен (блок памяти)
300//Указывает длину в байтах блока, который будет обнулен (длина блока памяти)
);
scanf("%s",&str); //выводит на экран
printf("Enter server name please:\n");
scanf("%s",&str1);
strcpy(&pName[0],"\\\\");
strcat(&pName[0],&str1[0]);
strcat(&pName[0],"\\pipe\\");
strcat(&pName[0],&str[0]);
HANDLE hFile = CreateFile(pName,GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
printf("Something is wrong...");
return(GetLastError());
}
}
 
M

Maxx

#2
чтобы связать через pipe две машины нужно установить соответствующие разрешения
для каналов (я думаю ошибка у клиента что-то типа access denied)
 
M

Maxx

#3
есть еще несколько ошибок в коде

код сервера

strcpy(&cName[0],"Hello world!");
WriteFile(
hPipe, // Дескриптор канала
&cName, // Указатель на массив записываемых байтов
sizeof(cName), // Куда поместить реально записанное количество
&lpBuf,NULL // Перекрытие не используем
);

когда пишешь что-нить куда-нить надо указывать размер реальных данных, а не размер буфера, т.е.
должно быть что-то типа

strcpy(&cName[0],"Hello world!");
WriteFile(
hPipe, // Дескриптор канала
&cName, // Указатель на массив записываемых байтов
strlen (cName) + 1, // РАЗМЕР ЗАПИСЫВАЕМЫХ ДАННЫХ
&lpBuf,NULL // Перекрытие не используем
);

код клиента

char str1[100];
ZeroMemory(
&str1[0],//Указатель на начало блока, который будет обнулен (блок памяти)
300//Указывает длину в байтах блока, который будет обнулен (длина блока памяти)
);

а размер массива str1 какой? 100 или 300?

ну и открытые файлы (и остальные ресурсы) закрывать надо, когда они уже не используются
 
F

FanJuS

#4
а не скажите какие разрешения нужно установить?
 
M

Maxx

#5
Здесь есть программа, которая позволяет промотреть и установить разрешения для pipe, существующих в системе
 
F

FanJuS

#6
можт я не так запускаю, может надо определённое имя вводить?
я ввожу имя сервера и имя клиента и ничегоне происходит, потом клиент закрывается ;)
 
M

Maxx

#8
на сайте www.codeproject.com есть много примеров по работе с pipe
рекомендую зайти
 
F

FanJuS

#10
Мне кажется просто не так запускаю наверное, имя клиента это PipeSvr, а имя сервера не знаю :). Или может их можно только по сети запустить, т.е. может на одном компьютере не идут? Хотя думаю, что должны.
 
Статус
Закрыто для дальнейших ответов.