Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. Named pipes: C# server, C++ client

Named pipes: C# server, C++ client

Scheduled Pinned Locked Moved C#
csharpc++sysadminquestion
14 Posts 2 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    Crazy Joe Devola
    wrote on last edited by
    #1

    I wrote 2 pairs of named pipe client/server programs: 1st pair in C# (.NET 4) 2nd pair in C++ (un-managed) All 4 test programs use the same pipe name \\\\.\pipe\mypipe The C# pair work fine with each other - I send a message from the client and it is received by the server. The C++ pair work also fine with each other. But... when I try to run the C# client with the C++ server, or the C++ client with the C# server - then it doesn't work. The client is unable to connect to the server. Is there something preventing the C++ client from working with the .NET server? Should it work? Thank you.

    Richard Andrew x64R C 2 Replies Last reply
    0
    • C Crazy Joe Devola

      I wrote 2 pairs of named pipe client/server programs: 1st pair in C# (.NET 4) 2nd pair in C++ (un-managed) All 4 test programs use the same pipe name \\\\.\pipe\mypipe The C# pair work fine with each other - I send a message from the client and it is received by the server. The C++ pair work also fine with each other. But... when I try to run the C# client with the C++ server, or the C++ client with the C# server - then it doesn't work. The client is unable to connect to the server. Is there something preventing the C++ client from working with the .NET server? Should it work? Thank you.

      Richard Andrew x64R Offline
      Richard Andrew x64R Offline
      Richard Andrew x64
      wrote on last edited by
      #2

      Crazy Joe Devola wrote:

      The client is unable to connect to the server.

      When running the C++ client and it doesn't connect, check the error code: GetLastError()

      The difficult we do right away... ...the impossible takes slightly longer.

      C 1 Reply Last reply
      0
      • Richard Andrew x64R Richard Andrew x64

        Crazy Joe Devola wrote:

        The client is unable to connect to the server.

        When running the C++ client and it doesn't connect, check the error code: GetLastError()

        The difficult we do right away... ...the impossible takes slightly longer.

        C Offline
        C Offline
        Crazy Joe Devola
        wrote on last edited by
        #3

        it returns error code 2 - ERROR_FILE_NOT_FOUND

        Richard Andrew x64R 1 Reply Last reply
        0
        • C Crazy Joe Devola

          it returns error code 2 - ERROR_FILE_NOT_FOUND

          Richard Andrew x64R Offline
          Richard Andrew x64R Offline
          Richard Andrew x64
          wrote on last edited by
          #4

          You might want to try Sysinternals' Process Explorer. It can enumerate every kernel object (that includes pipes) that exists inside a process. This way you could be sure the pipe name is being created the way you intend.

          The difficult we do right away... ...the impossible takes slightly longer.

          C 1 Reply Last reply
          0
          • Richard Andrew x64R Richard Andrew x64

            You might want to try Sysinternals' Process Explorer. It can enumerate every kernel object (that includes pipes) that exists inside a process. This way you could be sure the pipe name is being created the way you intend.

            The difficult we do right away... ...the impossible takes slightly longer.

            C Offline
            C Offline
            Crazy Joe Devola
            wrote on last edited by
            #5

            thank you. I have Process Explorer but I don't know how to see list of objects for a process. I used the search option to search for "mypipe". It shows that the server has a handle to \Device\NamedPipe\pipe\mypipe . I tried to check the client to open "\\Device\\NamedPipe\\pipe\\mypipe" but that didn't help (I didn't expect it to work anyway).

            C 1 Reply Last reply
            0
            • C Crazy Joe Devola

              thank you. I have Process Explorer but I don't know how to see list of objects for a process. I used the search option to search for "mypipe". It shows that the server has a handle to \Device\NamedPipe\pipe\mypipe . I tried to check the client to open "\\Device\\NamedPipe\\pipe\\mypipe" but that didn't help (I didn't expect it to work anyway).

              C Offline
              C Offline
              Crazy Joe Devola
              wrote on last edited by
              #6

              This is how the client opens the pipe:

              hPipe=CreateFile("\\\\.\\pipe\\mypipe",
              GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE,
              0,
              NULL,
              OPEN_EXISTING,
              0,
              NULL) ;

              if ( hPipe!=INVALID_HANDLE_VALUE)
              {
              return 0; //Success!!!
              }

              err = GetLastError();
              if(err!=ERROR_PIPE_BUSY)
              {
              printf("Could not open pipe, GetLastError=%u\n", err);
              return -1 ;
              }

              Create file returns an invalid handle. GetLastError() returns 2.

              Richard Andrew x64R 1 Reply Last reply
              0
              • C Crazy Joe Devola

                This is how the client opens the pipe:

                hPipe=CreateFile("\\\\.\\pipe\\mypipe",
                GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE,
                0,
                NULL,
                OPEN_EXISTING,
                0,
                NULL) ;

                if ( hPipe!=INVALID_HANDLE_VALUE)
                {
                return 0; //Success!!!
                }

                err = GetLastError();
                if(err!=ERROR_PIPE_BUSY)
                {
                printf("Could not open pipe, GetLastError=%u\n", err);
                return -1 ;
                }

                Create file returns an invalid handle. GetLastError() returns 2.

                Richard Andrew x64R Offline
                Richard Andrew x64R Offline
                Richard Andrew x64
                wrote on last edited by
                #7

                You do know that backslashes need to be escaped in C++, right? It should be:

                hPipe=CreateFile("\\\\.\\pipe\\mypipe",
                GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE,
                0,
                NULL,
                OPEN_EXISTING,
                0,
                NULL) ;

                The difficult we do right away... ...the impossible takes slightly longer.

                C 1 Reply Last reply
                0
                • Richard Andrew x64R Richard Andrew x64

                  You do know that backslashes need to be escaped in C++, right? It should be:

                  hPipe=CreateFile("\\\\.\\pipe\\mypipe",
                  GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE,
                  0,
                  NULL,
                  OPEN_EXISTING,
                  0,
                  NULL) ;

                  The difficult we do right away... ...the impossible takes slightly longer.

                  C Offline
                  C Offline
                  Crazy Joe Devola
                  wrote on last edited by
                  #8

                  Yes i do :-) for some reason the codeproject shows just 1 backslash. I do have it like this:

                  "\\\\.\\pipe\\mypipe"

                  Richard Andrew x64R 1 Reply Last reply
                  0
                  • C Crazy Joe Devola

                    Yes i do :-) for some reason the codeproject shows just 1 backslash. I do have it like this:

                    "\\\\.\\pipe\\mypipe"

                    Richard Andrew x64R Offline
                    Richard Andrew x64R Offline
                    Richard Andrew x64
                    wrote on last edited by
                    #9

                    Let's see the code that creates the pipes in both projects.

                    The difficult we do right away... ...the impossible takes slightly longer.

                    C 1 Reply Last reply
                    0
                    • Richard Andrew x64R Richard Andrew x64

                      Let's see the code that creates the pipes in both projects.

                      The difficult we do right away... ...the impossible takes slightly longer.

                      C Offline
                      C Offline
                      Crazy Joe Devola
                      wrote on last edited by
                      #10

                      Server: C# NamedPipeServerStream pipeServer = new NamedPipeServerStream("\\\\.\\pipe\\mypipe", PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); // Wait for a connection pipeServer.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), pipeServer); Client: C++

                      	hPipe=CreateFile("\\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\mypipe", 
                      	                 GENERIC\_READ | GENERIC\_WRITE,
                      	                 0,
                      	                 NULL,
                      	                 OPEN\_EXISTING,
                      	                 0,
                      	                 NULL) ;
                      	if ( hPipe!=INVALID\_HANDLE\_VALUE) 
                      	{
                      		return 0; //Success!!!
                      	}
                      
                      	err = GetLastError();
                      	if(err!=ERROR\_PIPE\_BUSY)
                      	{
                      		printf("Could not open pipe, GetLastError=%u\\n", err);
                      		return -1 ;
                      	}
                      
                      	printf("Could not open pipe, GetLastError=%u. WaitNamedPipe.\\n", err);
                      	if(! WaitNamedPipe(pipe\_name,2000))
                      	{
                      		printf("Could not open pipe\\n");
                      		return -1 ;
                      	}
                      

                      again: C++ client with C++ server - works. C# client with C# server - works. C++ client with C# server - does not works. Thank you.

                      Richard Andrew x64R 1 Reply Last reply
                      0
                      • C Crazy Joe Devola

                        Server: C# NamedPipeServerStream pipeServer = new NamedPipeServerStream("\\\\.\\pipe\\mypipe", PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); // Wait for a connection pipeServer.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallBack), pipeServer); Client: C++

                        	hPipe=CreateFile("\\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\mypipe", 
                        	                 GENERIC\_READ | GENERIC\_WRITE,
                        	                 0,
                        	                 NULL,
                        	                 OPEN\_EXISTING,
                        	                 0,
                        	                 NULL) ;
                        	if ( hPipe!=INVALID\_HANDLE\_VALUE) 
                        	{
                        		return 0; //Success!!!
                        	}
                        
                        	err = GetLastError();
                        	if(err!=ERROR\_PIPE\_BUSY)
                        	{
                        		printf("Could not open pipe, GetLastError=%u\\n", err);
                        		return -1 ;
                        	}
                        
                        	printf("Could not open pipe, GetLastError=%u. WaitNamedPipe.\\n", err);
                        	if(! WaitNamedPipe(pipe\_name,2000))
                        	{
                        		printf("Could not open pipe\\n");
                        		return -1 ;
                        	}
                        

                        again: C++ client with C++ server - works. C# client with C# server - works. C++ client with C# server - does not works. Thank you.

                        Richard Andrew x64R Offline
                        Richard Andrew x64R Offline
                        Richard Andrew x64
                        wrote on last edited by
                        #11

                        This is just a guess, but could it be that since you have specified both GENERIC_READ and GENERIC_WRITE for the client, then you need to open the server as "InOut"?

                        The difficult we do right away... ...the impossible takes slightly longer.

                        C 1 Reply Last reply
                        0
                        • Richard Andrew x64R Richard Andrew x64

                          This is just a guess, but could it be that since you have specified both GENERIC_READ and GENERIC_WRITE for the client, then you need to open the server as "InOut"?

                          The difficult we do right away... ...the impossible takes slightly longer.

                          C Offline
                          C Offline
                          Crazy Joe Devola
                          wrote on last edited by
                          #12

                          I thought of that. I tried changing the server side to InOut - it did not help. i also tried changing the client to GENERIC_WRITE without GENERIC_READ - it didn't work either. Thank you for all the advise, tips and time you spent trying to help - much appreciated.

                          1 Reply Last reply
                          0
                          • C Crazy Joe Devola

                            I wrote 2 pairs of named pipe client/server programs: 1st pair in C# (.NET 4) 2nd pair in C++ (un-managed) All 4 test programs use the same pipe name \\\\.\pipe\mypipe The C# pair work fine with each other - I send a message from the client and it is received by the server. The C++ pair work also fine with each other. But... when I try to run the C# client with the C++ server, or the C++ client with the C# server - then it doesn't work. The client is unable to connect to the server. Is there something preventing the C++ client from working with the .NET server? Should it work? Thank you.

                            C Offline
                            C Offline
                            Crazy Joe Devola
                            wrote on last edited by
                            #13

                            I think the problem was found.... On stackoverflow, someone posted this answer: C#'s NamedPipeClientStream, NamedPipeServerStream automatically append "\.\\pipe\" to the name I changed the C# code to open the pipe just as "mypipe" and now the connection is successful.

                            Richard Andrew x64R 1 Reply Last reply
                            0
                            • C Crazy Joe Devola

                              I think the problem was found.... On stackoverflow, someone posted this answer: C#'s NamedPipeClientStream, NamedPipeServerStream automatically append "\.\\pipe\" to the name I changed the C# code to open the pipe just as "mypipe" and now the connection is successful.

                              Richard Andrew x64R Offline
                              Richard Andrew x64R Offline
                              Richard Andrew x64
                              wrote on last edited by
                              #14

                              Glad you got it sorted. :)

                              The difficult we do right away... ...the impossible takes slightly longer.

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups