title: Two way C++ to C# communication using named pipes
body: <p>I am trying to have a 2-way communication between a VC++ 6 app and a C# app. I am using named pipes. In my C++ code I can read the message from the C# client but then the server "dies" and I have to restart it again.  </p>
  
  <p>What I want to do is have the C# app connect to the C++ app, request a status, and the C++ app goes off and checks the status, and then returns either "busy" or "idle".</p>
  
  <p>I can't write anything back to the C# client as it says the connection has been closed. Some things I have commented out are things I have tried already.</p>
  
  <p>C++ code (started as a thread)</p>
  
  <pre><code>UINT CNamedPipe::StartNamedPipeServer()
  {
  LPTSTR lpszPipename = "\\\\.\\pipe\\SAPipe"; 
      HANDLE hPipe; 
      BOOL flg;
      DWORD dwWrite,dwRead;
      char szServerUpdate[200];
      char szClientUpdate[200];
  
      hPipe = CreateNamedPipe (    lpszPipename, 
                                  PIPE_ACCESS_DUPLEX,
                                  PIPE_TYPE_MESSAGE | 
                                  PIPE_READMODE_MESSAGE | 
                                  PIPE_NOWAIT,                    //changed from nowait
                                  PIPE_UNLIMITED_INSTANCES,    // max. instances 
                                  BUFSIZE,                    // output buffer size 
                                  BUFSIZE,                    // input buffer size 
                                  PIPE_TIMEOUT,                // client time-out 
                                  NULL);                        // no security attribute 
  
      if (hPipe == INVALID_HANDLE_VALUE) 
          return 0;
  
      ConnectNamedPipe(hPipe, NULL);
  
      while(m_bServerActive)  //This seems to work well ....
      {
  
          //Read from client
          flg = ReadFile(hPipe,szClientUpdate,strlen(szClientUpdate),&amp;dwRead, NULL);
  
          if(flg) //Read something from the client!!!!
          {
              CString csMsg,csTmp;
  
              for(int i=0;i&lt;dwRead;i++){
                  csTmp.Format("%c",szClientUpdate[i]);
                  csMsg += csTmp;
              }
  
  
              AfxMessageBox("Client message: " + csMsg);
  
              strcpy( szServerUpdate,"busy");
  
              //Write status to Client
              flg = WriteFile(hPipe, szServerUpdate, strlen(szServerUpdate), &amp;dwWrite, NULL);
  
              EndServer();
              StartServer();
          }
  
      }
  
      return 0;
  </code></pre>
  
  <p>}</p>
  
  <p>C# Code:</p>
  
  <pre><code>public void ThreadStartClient(object obj)
      {
          // Ensure that we only start the client after the server has created the pipe
          ManualResetEvent SyncClientServer = (ManualResetEvent)obj;
  
          // Only continue after the server was created -- otherwise we just fail badly
          // SyncClientServer.WaitOne();
  
          using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", "SAPipe"))
          {
              // The connect function will indefinately wait for the pipe to become available
              // If that is not acceptable specify a maximum waiting time (in ms)
              pipeStream.Connect();
  
              //Write from client to server
             using (StreamWriter sw = new StreamWriter(pipeStream))
              {
                  sw.WriteLine("What's your status?");
             }
  
              //Read server reply
              /*using (StreamReader sr = new StreamReader(pipeStream))
              {
                  string temp = "";
                  temp = sr.ReadLine();   //Pipe is already closed here ... why?
  
                  MessageBox.Show(temp);
  
              }*/
  
              //pipeStream.Close();
  
          }
      }
  }
  </code></pre>