Navnet Pipe C # klient kan ikke oprette forbindelse til C + + server

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få en C ++-applikation til at lade en C # -applikation vide, hvornår en bestemt handling sker. Måden jeg forsøger at gøre er via navngivne rør.


Jeg har oprettet en navngivet pipeserver på C ++-appen, som synes at virke (det navngivne rør bliver oprettet - det vises på listen hentet af PipeList) og en navngivet pipeklient på C # -appen, hvor den fejler: Først linje i C # klientkode giver 'Rørhåndtag er ikke indstillet. Har din PipeStream-implementering kaldet InitializeHandle? 'Fejl, og linje 2 kaster' Adgang til stien er nægtet 'undtagelse. [7]


Hvor går jeg galt?


C ++ Server kode


CString namedPipeName = "\\.\pipe\TitleChangePipe";

HANDLE pipe = CreateNamedPipe(namedPipeName, PIPE\_ACCESS\_INBOUND , PIPE\_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
if (pipe == INVALID\_HANDLE\_VALUE) {
    MessageBox(NULL, "Pipe Could Not be Established.", "Error: TCM", MB\_ICONERROR);
    return -1;
}

char line[512]; DWORD numRead;

while (true)//just keep doing this
{
    numRead = 1;
    while ((numRead < 10 || numRead > 511) && numRead > 0)
    {
        if (!ReadFile(pipe, line, 512, &numRead, NULL) || numRead < 1) {//Blocking call
            CloseHandle(pipe);                                          //If something went wrong, reset pipe
            pipe = CreateNamedPipe(namedPipeName, PIPE\_ACCESS\_INBOUND , PIPE\_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
            ConnectNamedPipe(pipe, NULL);
            if (pipe == INVALID\_HANDLE\_VALUE) {
                MessageBox(NULL, "Pipe Could Not be Established.", "Error: TCM", MB\_ICONERROR);
                return -1; }
            numRead = 1;
        }
    }
    line[numRead] = '';   //Terminate String
}   

CloseHandle(pipe);


C # klientkode


var client = new NamedPipeClientStream(".", "TitleChangePipe", PipeDirection.InOut);
client.Connect();
var reader = new StreamReader(client);
var writer = new StreamWriter(client);

while (true)
{
    var input = Console.ReadLine();
    if (String.IsNullOrEmpty(input))
         break;
    writer.WriteLine(input);
    writer.Flush();
    Console.WriteLine(reader.ReadLine());
}

Bedste reference


Den nævnte pipe creation har ikke de rigtige parametre.


Først vil du læse & skriv på røret, så flag til brug er: PIPE\_ACCESS\_DUPLEX


Derefter sender du beskeder i synkron tilstand. Brug disse flag: PIPE\_WAIT | PIPE\_TYPE\_MESSAGE


Endelig tillader du kun en forekomst af dette rør på maskinen. Selvfølgelig har du brug for mindst 2: Én til serveren en til klienten. Jeg ville bare bruge det ubegrænsede flag: PIPE\_UNLIMITED\_INSTANCES


HANDLE pipe = CreateNamedPipe(namedPipeName, PIPE\_ACCESS\_DUPLEX, 
                              PIPE\_WAIT | PIPE\_TYPE\_MESSAGE, PIPE\_UNLIMITED\_INSTANCES, 
                              1024, 1024, 120 * 1000, NULL);


Når du har lavet et rør i serveren, skal du vente på forbindelser på dette rør, før du bruger det: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365146 (v=vs.85) .aspx [[[8]