2016-12-29 6 views
1

Я пытаюсь отправить сообщения через именованные каналы между двумя компьютерами Windows. При вызове CreateNamedPipe локально все работает нормально. Если я изменю имя хоста от "\\\\.\\pipe\\testpipename" до "\\\\myHostname\\pipe\\testpipename", я получаю ERROR_INVALID_NAME(123) от getLastError().C++ Named Pipes over network неверное имя error

Это мой код:

BOOL fConnected = FALSE; 
    DWORD dwThreadId = 0; 
    HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL; 
    LPTSTR pipeName = /*nullptr*/ TEXT("\\\\myHostname\\pipe\\testpipename"); 

    SECURITY_ATTRIBUTES sa = { 0 }; 
    SECURITY_DESCRIPTOR sd = { 0 }; 

    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 

    SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 

    sa.bInheritHandle = false; 
    sa.lpSecurityDescriptor = &sd; 
    sa.nLength = sizeof(sa); 

    hPipe = CreateNamedPipe(
    pipeName,     // pipe name 
    PIPE_ACCESS_DUPLEX,  // read/write access 
    PIPE_TYPE_MESSAGE |  // message type pipe 
    PIPE_READMODE_MESSAGE | // message-read mode 
    PIPE_WAIT,    // blocking mode 
    PIPE_UNLIMITED_INSTANCES, // max. instances 
    255,      // output buffer size 
    255,      // input buffer size 
    0,      // client time-out 
    &sa);      // default security attribute 

    if (hPipe == INVALID_HANDLE_VALUE) 
    { 
     cout << GetLastError(); 
     return -2; 
    } 

    cout << "Waiting for client to connect!" << endl; 

    //waiting for client to connect 
    fConnected = ConnectNamedPipe(hPipe, NULL) ? 
     TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); 

    cout << "Client connected! YEAH" << endl; 

Я думаю, что pipename является недействительным, но я не знаю, почему. Есть идеи?

+0

Вы пытались использовать IP-адрес вместо имени хоста? – fsp

+0

@ user3549596 Да, такая же ошибка возникает. – Strizzi

+0

может показаться глупым, но верно ли это имя канала и разрешен порт 445 на сервере? – fsp

ответ

0

Проблема решена! Pipenames для сервера и клиента являются:

Сервер: "\\\\.\\pipe\\testpipe"
Клиент: "\\\\serverHostName\\pipe\\testpipe"

Некоторые незначительные изменения у клиента были также сделаны. Полный код можно найти по адресу: my Github repo.