связь между c ++ и c # через канал - PullRequest
6 голосов
/ 15 декабря 2009

Я хочу отправить данные из приложения c # в приложение c ++ через канал. Вот что я сделал:

это клиент C ++:

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


int _tmain(int argc, _TCHAR* argv[]) {

  HANDLE hFile;
  BOOL flg;
  DWORD dwWrite;
  char szPipeUpdate[200];
  hFile = CreateFile(L"\\\\.\\pipe\\BvrPipe", GENERIC_WRITE,
                             0, NULL, OPEN_EXISTING,
                             0, NULL);

  strcpy(szPipeUpdate,"Data from Named Pipe client for createnamedpipe");
  if(hFile == INVALID_HANDLE_VALUE)
  { 
      DWORD dw = GetLastError();
      printf("CreateFile failed for Named Pipe client\n:" );
  }
  else
  {
      flg = WriteFile(hFile, szPipeUpdate, strlen(szPipeUpdate), &dwWrite, NULL);
      if (FALSE == flg)
      {
         printf("WriteFile failed for Named Pipe client\n");
      }
      else
      {
         printf("WriteFile succeeded for Named Pipe client\n");
      }
      CloseHandle(hFile);
  }
return 0;

}

а вот сервер c #

using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
namespace PipeApplication1{

class ProgramPipeTest
{

    public void ThreadStartServer()
    {
        // Create a name pipe
        using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("\\\\.\\pipe\\BvrPipe"))
        {
            Console.WriteLine("[Server] Pipe created {0}", pipeStream.GetHashCode());

            // Wait for a connection
            pipeStream.WaitForConnection();
            Console.WriteLine("[Server] Pipe connection established");

            using (StreamReader sr = new StreamReader(pipeStream))
            {
                string temp;
                // We read a line from the pipe and print it together with the current time
                while ((temp = sr.ReadLine()) != null)
                {
                    Console.WriteLine("{0}: {1}", DateTime.Now, temp);
                }
            }
        }

        Console.WriteLine("Connection lost");
    }

    static void Main(string[] args)
    {
        ProgramPipeTest Server = new ProgramPipeTest();

        Thread ServerThread = new Thread(Server.ThreadStartServer);

        ServerThread.Start();

    }
}

}

когда я запускаю сервер, а затем клиент GetLastErrror от клиента возвращает 2 (система не может найти указанный файл.)

Есть идеи по этому поводу. Спасибо

Ответы [ 2 ]

6 голосов
/ 15 декабря 2009

Можно предположить, что вам не нужен префикс "\. \ Pipe \" при создании канала на сервере. примеры вызова конструктора NamedPipeServerStream, который я видел, просто передают имя канала.Например,

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("BvrPipe"))

Вы можете получить список открытых каналов и их имен, используя проводник процессов SysInternals.Это должно помочь вам проверить, что канал имеет правильное имя.Подробнее см. этот вопрос.

0 голосов
/ 15 декабря 2009

Пожалуйста, прочитайте это , чтобы увидеть, как реализованы каналы. Почему вы не используете вызов API CreateNamedPipes? Вы рассматриваете дескриптор файла на стороне C ++ как обычный файл, а не как канал. Следовательно, ваш код C ++ дает сбой, когда он ищет канал, когда на самом деле он пытался прочитать из файла.

...