Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Повторное присоединение к named pipe - неудача


Автор: EnergoHokum 3.9.2007, 14:38
Доброго всем времени суток. Проблема следующая: создаю named pipe:
Код

    HANDLE hPipe=CreateNamedPipe("\\\\.\\pipe\\serverPipe",                           \
                 PIPE_ACCESS_DUPLEX,                                           \
                 PIPE_TYPE_MESSAGE |                                        \
                 PIPE_READMODE_MESSAGE |                                  \
                 PIPE_WAIT,                                                \
                 10,0xFF,0xFF,                                                \
                 NMPWAIT_USE_DEFAULT_WAIT,NULL);
    if(hPipe == INVALID_HANDLE_VALUE)
    {
        printf("can'not create pipe\n");
        return -1;
    }
    if(ConnectNamedPipe(hPipe,NULL) == false)
    {
        printf("can'not set named pipe in connect\n");
        return -1;
    }

присоединяюсь к нему:
Код

    HANDLE hPipe=CreateFile("\\\\.\\pipe\\serverPipe",GENERIC_READ,            \
        0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    
    if(hPipe == INVALID_HANDLE_VALUE)
    {
        printf("can'not open existing pipe\n");
        return -1;
    }

но после отсоединения клиента и попытки вторично зацепиться на pipe получается "can'not open existing pipe". Неужели нельзя переподключиться?

Автор: NiJazz 4.9.2007, 07:42
Цитата

но после отсоединения клиента

Это CloseHandle?

Добавлено через 1 минуту и 42 секунды
А сервер вызывает DisconnectNamedPipe?

Автор: EnergoHokum 4.9.2007, 08:00
Отсоединение происходит со стороны клиента, там вызывается CloseHandle. На сервере DisconnectNamedPipe не вызываю. 

Автор: NiJazz 4.9.2007, 08:17
Цитата

На сервере DisconnectNamedPipe не вызываю.  

EnergoHokum, а ты попробуй.

Добавлено через 1 минуту и 39 секунд
Вот обычные вызовы сервера:
Код

FlushFileBuffers(hPipe); 
DisconnectNamedPipe(hPipe); 

Если повторного использования канала не предполагается, вызывается ещё CloseHandle(hPipe).

Автор: EnergoHokum 4.9.2007, 08:24
Ща попытаюсь...
А кстати, как на стороне сервера отловить отсоединение клиента? Или же клиент должен передать какую-то последовательность, которую сервер воспримет как "стоп клиента"?

Автор: NiJazz 4.9.2007, 08:35
Цитата

А кстати, как на стороне сервера отловить отсоединение клиента? Или же клиент должен передать какую-то последовательность, которую сервер воспримет как "стоп клиента"?

ReadFile или WriteFile возвращают FALSE с соответствующим кодом ошибки.

Добавлено через 1 минуту и 7 секунд
Клиент ничего не должен посылать, просто отсоединяться.

Автор: EnergoHokum 4.9.2007, 08:59
Повторное подсоединение клиента не удаётся, хотя канал сохраняется. Мне вообще непонятно, из-за чего эта ботва происходит? Named pipe - по сути файл, почему я не могу повторно открыть тот-же самый файл?

Автор: NiJazz 4.9.2007, 09:04
EnergoHokum, можешь скинуть код на мыло с указанием мест, где происходят ошибки.

Автор: EnergoHokum 4.9.2007, 09:12
Сейчас не могу, у нас тут мыло забрали smile Только вечером из дома получится... Сейчас на сервере закрываю/открываю handle канала при отсоединении клиента - вроде помогает, но неправильно же это!

Автор: NiJazz 4.9.2007, 09:14
Посмотри http://msdn2.microsoft.com/en-us/library/aa365588.aspx. Там есть также ссылка на пример для клиента.

Добавлено через 28 секунд
Цитата

но неправильно же это! 

Да, неправильно.

Автор: EnergoHokum 4.9.2007, 09:22
Да, блин, моя английское быть хромым, общий смысл вроде понимаю, но мелочи и детали... :-(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)