Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с именованными каналами, не могу создать канал 
:(
    Опции темы
War_Chief
Дата 13.1.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



Народ спасайте!
Пытаюсь научится работать с именованными каналами но результат всегда один и тот же:"НЕМОГУ СОЗДАТЬ КАНАЛ".
Суть програмы в том что сервер создает канал и ждет пока клиент запишет туда данные а потом читает отдуда данные!
Компилятор у меня Microsoft Visual C++ 2008.

Код сервера:
Код

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
  HANDLE hNamedPipe;
  
  // создаем именованный канал для чтения
  hNamedPipe = CreateNamedPipe(
    (LPCTSTR)"\\.\pipe\demo_pipe",      // имя канала
    PIPE_ACCESS_INBOUND,           // читаем из канала
    PIPE_TYPE_MESSAGE | PIPE_WAIT, // синхронная передача сообщений
    2,         // максимальное количество экземпляров канала
    0,         // размер выходного буфера по умолчанию
    0,         // размер входного буфера по умолчанию
    INFINITE,  // клиент ждет связь бесконечно долго
    NULL       // защита по умолчанию
    );
  // проверяем на успешное создание
  if (hNamedPipe == INVALID_HANDLE_VALUE)
  {
    cerr << "Create named pipe failed." << endl
      << "The last error code: " << GetLastError() << endl;
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }
  
  // ждем, пока клиент свяжется с каналом
  cout << "The server is waiting for connection with a client." << endl;
  if(!ConnectNamedPipe(
    hNamedPipe,    // дескриптор канала
    NULL      // связь синхронная
    ))
  {
    cerr << "The connection failed." << endl
      << "The last error code: " << GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }

  // читаем данные из канала
  for (int i = 0; i < 10; i++)
  {
    int nData;
    DWORD dwBytesRead;
    if (!ReadFile(
      hNamedPipe,    // дескриптор канала
      &nData,        // адрес буфера для ввода данных
      sizeof(nData), // число читаемых байтов
      &dwBytesRead,  // число прочитанных байтов
      NULL           // передача данных синхронная
      ))
    {
      cerr << "Read file failed." << endl
        << "The last error code: " << GetLastError() << endl;
      CloseHandle(hNamedPipe);
      cout << "Press any key to exit.";
      cin.get();

      return 0;
    }
    // выводим прочитанные данные на консоль
    cout << "The number " << nData << " was read by the server" << endl;
  }
  // закрываем дескриптор канала 
  CloseHandle(hNamedPipe);
  // завершаем процесс
  cout << "The data are read by the server."<<endl;
  cout << "Press any key to exit.";
  cin.get();

  return 0;
}


Код клиента:
Код

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
  HANDLE hNamedPipe;
  char pipeName[] = "\\.\pipe\demo_pipe";
  
  // связываемся с именованным каналом
  hNamedPipe = CreateFile(
  (LPCWSTR)pipeName,        // имя канала
    GENERIC_WRITE,   // записываем в канал
    FILE_SHARE_READ, // разрешаем одновременное чтение из канала
    NULL,            // защита по умолчанию
    OPEN_EXISTING,   // открываем существующий канал
    0,     // атрибуты по умолчанию
    NULL   // дополнительных атрибутов нет
    );
  
  // проверяем связь с каналом
  if (hNamedPipe == INVALID_HANDLE_VALUE)
  {
    cerr << "Connection with the named pipe failed." << endl
      << "The last error code: " << GetLastError() << endl;
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }

  // пишем в именованный канал
  for (int i = 0; i < 10; i++)
  {
    DWORD dwBytesWritten;    
    if (!WriteFile(
      hNamedPipe,  // дескриптор канала
      &i,          // данные
      sizeof(i),   // размер данных
      &dwBytesWritten,   // количество записанных байтов
      NULL         // синхронная запись
      ))
    {
      // ошибка записи
      cerr << "Writing to the named pipe failed: " << endl
        << "The last error code: " << GetLastError() << endl;
      CloseHandle(hNamedPipe);
      cout << "Press any key to exit.";
      cin.get();

      return 0;
    }
    // выводим число на консоль
    cout << "The number " << i << " is written to the named pipe."
         << endl;
    Sleep(1000);
  }
  // закрываем дескриптор канала
  CloseHandle(hNamedPipe);
  // завершаем процесс
  cout << "The data are written by the client." << endl
    << "Press any key to exit.";
  cin.get();

  return 0;
}

PM MAIL ICQ   Вверх
BorisVorontsov
Дата 13.1.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Цитата(War_Chief @  13.1.2008,  18:48 Найти цитируемый пост)
но результат всегда один и тот же


GetLastError?


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
War_Chief
Дата 13.1.2008, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



BorisVorontsov, 
да всегда одно и тоже.
Я незнаю может ето компилятор гонит, потомучто я поставил Visual Studio 2008!!
PM MAIL ICQ   Вверх
NiJazz
Дата 13.1.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Цитата

да всегда одно и тоже.
Я незнаю может ето компилятор гонит, потомучто я поставил Visual Studio 2008!! 

 smile

Добавлено через 5 минут и 12 секунд
Сразу обратил внимание: 
Код

(LPCTSTR)"\\.\pipe\demo_pipe"

Попробуй:
Код

(LPCTSTR)"\\\\.\\pipe\\demo_pipe"


Добавлено через 6 минут и 9 секунд
Иными словами - неверное имя пайпа, возвращает ошибку. А ты мог бы значение ошибки привести?
PM MAIL   Вверх
586
Дата 13.1.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(War_Chief @  13.1.2008,  18:48 Найти цитируемый пост)
  char pipeName[] = "\\.\pipe\demo_pipe";
  
  // связываемся с именованным каналом
  hNamedPipe = CreateFile(
  (LPCWSTR)pipeName,        // имя канала

Так нельзя делать smile

Добавлено через 3 минуты и 10 секунд
Код
static const TCHAR pipeName[] = TEXT("\\\\.\\pipe\\demo_pipe";

hNamedPipe = CreateFile(
       pipeName,
//...

PM   Вверх
War_Chief
Дата 14.1.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



586, 
сработало!
Огромное спасибо!))))
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.