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

Тема в разделе "Общие вопросы по С и С++", создана пользователем FanJuS, 28 янв 2008.

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

    FanJuS Гость

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

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

    Код (Text):
    #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);
    }
    Часть вторая - клиент.

    Код (Text):
    #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());
    }
    }
     
  2. Maxx

    Maxx Гость

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

    Maxx Гость

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

    код сервера

    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?

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

    FanJuS Гость

    а не скажите какие разрешения нужно установить?
     
  5. Maxx

    Maxx Гость

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

    FanJuS Гость

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

    FanJuS Гость

    Спасибо! Возникнут ещё идеи пишите ;)
     
  8. Maxx

    Maxx Гость

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

    FanJuS Гость

    Спасибо посмотрю B)
     
  10. FanJuS

    FanJuS Гость

    Мне кажется просто не так запускаю наверное, имя клиента это PipeSvr, а имя сервера не знаю :). Или может их можно только по сети запустить, т.е. может на одном компьютере не идут? Хотя думаю, что должны.
     
Загрузка...
Похожие Темы - Проблема именованными каналами
  1. AgniXRudra
    Ответов:
    2
    Просмотров:
    54
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    31
  3. c0de3r
    Ответов:
    5
    Просмотров:
    155
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    160
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    145
Статус темы:
Закрыта.

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