简体   繁体   中英

Named Pipes Client Error 5 (C++)

Ok so below I have the code for named pipe server/client. I have the server placed on my Windows 8 computer and it creates a pipe and then waits for the client to connect. Then I start the client on my Windows 7 but it returns error 5 (Access denied, I think??) Can someone explain to me why it is giving me error 5 please?

Thnx in advance for all the answers

Server Code

#include "stdafx.h"
#include "windows.h"
#include <iostream> 

using namespace std; 

#define g_szPipeName "\\\\.\\pipe\\pipename"  //Name given to the pipe


#define BUFFER_SIZE 1024 //1k
#define ACK_MESG_RECV "Message received successfully"
#define _CRT_SECURE_NO_WARNINGS 


HANDLE hPipe;

int repeate() {
    char szBuffer[BUFFER_SIZE];
    DWORD cbBytes;

    //We are connected to the client.
    //To communicate with the client we will use ReadFile()/WriteFile() 
    //on the pipe handle - hPipe

    //Read client message
    BOOL bResult = ReadFile(
        hPipe,                // handle to pipe 
        szBuffer,             // buffer to receive data 
        sizeof(szBuffer),     // size of buffer 
        &cbBytes,             // number of bytes read 
        NULL);                // not overlapped I/O 

    if ((!bResult) || (0 == cbBytes))
    {
        printf("\nError occurred while reading from the client: %d", GetLastError());
        CloseHandle(hPipe);
        system("Pause");
        return 1;  //Error
    }
    else
    {
        printf("\nReadFile() was successful.");
    }

    printf("\nClient sent the following message: %s", szBuffer);

    strcpy(szBuffer, ACK_MESG_RECV);

    //Reply to client
    bResult = WriteFile(
        hPipe,                // handle to pipe 
        szBuffer,             // buffer to write from 
        strlen(szBuffer) + 1,   // number of bytes to write, include the NULL 
        &cbBytes,             // number of bytes written 
        NULL);                // not overlapped I/O 

    if ((!bResult) || (strlen(szBuffer) + 1 != cbBytes))
    {
        printf("\nError occurred while writing to the client: %d", GetLastError());
        CloseHandle(hPipe);
        system("Pause");
        return 1;  //Error
    }
    else
    {
        printf("\nWriteFile() was successful.");
    }
    repeate();

}



int main(int argc, char* argv[])
{

    SECURITY_DESCRIPTOR sd;
    InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);

    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = &sd;


    hPipe = CreateNamedPipe(
        g_szPipeName,             // 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  
        BUFFER_SIZE,              // output buffer size 
        BUFFER_SIZE,              // input buffer size 
        NMPWAIT_USE_DEFAULT_WAIT,
        &sa);




        if (INVALID_HANDLE_VALUE == hPipe)
        {
            printf("\nError occurred while creating the pipe: %d", GetLastError());
            system("Pause");
            return 1;  //Error
        }
        else
        {
            printf("\nCreateNamedPipe() was successful.");
        }

        printf("\nWaiting for client connection...");

        //Wait for the client to connect
        BOOL bClientConnected = ConnectNamedPipe(hPipe, NULL);

        if (FALSE == bClientConnected)
        {
            printf("\nError occurred while connecting to the client: %d", GetLastError());
            CloseHandle(hPipe);
            system("Pause");
            return 1;  //Error
        }
        else
        {
            printf("\nConnectNamedPipe() was successful.");
        }


        repeate();

    }

Client Code

#include "stdafx.h" 
#include "windows.h"
#include <iostream>

#define g_szPipeName "\\\\MyComputerName\\pipe\\pipename"  //Name given to the pipe 


#define BUFFER_SIZE 1024 //1k
#define ACK_MESG_RECV "Message received successfully"

HANDLE hPipe;

int repeate() {
    char szBuffer[BUFFER_SIZE];

    printf("\nEnter a message to be sent to the server: ");
    gets(szBuffer);

    DWORD cbBytes;

    //Send the message to server
    BOOL bResult = WriteFile(
        hPipe,                // handle to pipe 
        szBuffer,             // buffer to write from 
        strlen(szBuffer) + 1,   // number of bytes to write, include the NULL
        &cbBytes,             // number of bytes written 
        NULL);                // not overlapped I/O 

    if ((!bResult) || (strlen(szBuffer) + 1 != cbBytes))
    {
        printf("\nError occurred while writing to the server: %d", GetLastError());
        CloseHandle(hPipe);
        system("Pause");
        return 1;  //Error
    }
    else
    {
        printf("\nWriteFile() was successful.");
    }

    //Read server response
    bResult = ReadFile(
        hPipe,                // handle to pipe 
        szBuffer,             // buffer to receive data 
        sizeof(szBuffer),     // size of buffer 
        &cbBytes,             // number of bytes read 
        NULL);                // not overlapped I/O 

    if ((!bResult) || (0 == cbBytes))
    {
        printf("\nError occurred while reading from the server: %d", GetLastError());
        CloseHandle(hPipe);
        system("Pause");
        return 1;  //Error
    }
    else
    {
        printf("\nReadFile() was successful.");
    }

    printf("\nServer sent the following message: %s", szBuffer);
    repeate();

}

int main(int argc, char* argv[])
{


     //Connect to the server pipe using CreateFile()
     hPipe = CreateFile( 
          g_szPipeName,   // pipe name 
          GENERIC_READ |  // read and write access 
          GENERIC_WRITE, 
          0,              // no sharing 
          NULL,           // default security attributes
          OPEN_EXISTING,  // opens existing pipe 
          0,              // default attributes 
          NULL);          // no template file 

     if (INVALID_HANDLE_VALUE == hPipe) 
     {
          printf("\nError occurred while connecting to the server: %d", GetLastError()); 
          //One might want to check whether the server pipe is busy
          //This sample will error out if the server pipe is busy
          //Read on ERROR_PIPE_BUSY and WaitNamedPipe() for that
          system("Pause");
          return 1;  //Error
     }
     else
     {
          printf("\nCreateFile() was successful.");
     }

     //We are done connecting to the server pipe, 
     //we can start communicating with the server using ReadFile()/WriteFile() 
     //on handle - hPipe


     repeate(); 
}

Configure both computers by adding ip address, subnet mask, default gateway. From Network and Sharing Center, turn on all sharing and turn off password protected sharing. Test it by pinging ip address from cmd. User account of the both computers should not be password protected. That's why i fixed the Client Error 5 and set up named pipe communication between two remote computers

The client should use OpenFile(), not CreateFile(). The client doesn't want to create anything new, it wants to talk to an existing pipe.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM