C++ Pipe

12/26/2011 01:10 insert-name-here#1
Hallo liebe Community

Kann mir jemand erklären wie ich in c++ eine pipe baue die mit meinem c# programm kommunizieren kann? hab im internet kein gutes tutorial dazu gefunden wenn jemand eins hat pls verlinken.


schon mal Danke im vorraus ^^
12/26/2011 01:37 MoepMeep#2
Sollte reichen
[Only registered and activated users can see links. Click Here To Register...]
Den C# Teil kriegst du ja denke ich selber hin. NamedPipedServerStream/NamedPipedClientStream.
12/26/2011 13:29 insert-name-here#3
Ich hab im Internet 2 Pipe's gefunden eine C# und eine C++ aber das mit dem verbinden klapt nicht so ganz richtig :-/
Die C# Pipe

Code:
using System;
using System.IO;
using System.IO.Pipes;

namespace PipeServer
{
    internal class Program
    {
        private static void Main()
        {
            while (1 == 1)
            {
                using (var pipeServerStream = new NamedPipeServerStream("ShaiyaPipe"))
                {
                    Console.WriteLine("Waiting for connection.");
                    pipeServerStream.WaitForConnection();

                    Console.WriteLine("Connected to client.");
                    using (var streamReader = new StreamReader(pipeServerStream))
                    {
                        var data = streamReader.ReadLine();
                        if (data != null)
                            Console.WriteLine("Received: " + data);
                    }
                }

            }
        }
    }
}
so und jetzt die C++ Pipe

Code:
#include "stdafx.h"
#include <windows.h> 
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>


int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hPipe = ::CreateNamedPipeA((LPSTR)"\\\\.\\pipe\\ShaiyaPipe", 
					  PIPE_ACCESS_DUPLEX, 
					  PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
					  PIPE_UNLIMITED_INSTANCES, 4096, 4096,
					  NMPWAIT_USE_DEFAULT_WAIT, NULL);

	if(hPipe== INVALID_HANDLE_VALUE)
		printf("fail\n");
	else
		printf("work");
  
	ConnectNamedPipe(hPipe, NULL);
	for(;;)
	{
		if(ConnectNamedPipe(hPipe, NULL)==0)
		{
			printf("ConnectNamedPipe(hPipe, NULL)==0\n");
			if(GetLastError()==ERROR_NO_DATA)
			{
				printf("previous closed,ERROR_NO_DATA\n");
				DisconnectNamedPipe(hPipe);
				ConnectNamedPipe(hPipe, NULL);
			}
		}
		else
			printf("Client Connected!\n");
		Sleep(2000);
	};
	Sleep(10000);
}
Da stimmt ja schon was mit der hPipe== INVALID_HANDLE_VALUE nicht aber was ?
12/26/2011 13:55 MoepMeep#4
Man kann ja wohl erwarten, dass du die entsprechenden msdn artikel liest, oder?
[Only registered and activated users can see links. Click Here To Register...]
Quote:
Return value

If the function succeeds, the return value is a handle to the server end of a named pipe instance.

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
12/26/2011 13:59 insert-name-here#5
Leute ich hab jetzt diesen code hier
Code:
int _tmain(int argc, _TCHAR* argv[])
{
  LPCTSTR _PIPE_NAME = L"\\\\.\\pipe\\ShaiyaPipe";
  HANDLE hPipe = CreateFile(_PIPE_NAME, GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);

  if(INVALID_HANDLE_VALUE == hPipe) {
    cout << "Konnte Pipe nicht ffnen" << endl;
    return 0;
  }

  DWORD nofRead;
  
  char bufIn [1000];
  while (1) {
    ReadFile(hPipe,
    bufIn, sizeof(bufIn), &nofRead, NULL);

    bufIn[nofRead]=0;
    cout << ">" << bufIn << endl;
	Sleep(1000);
  }
  return 0;
}
für die Pipe
aber in der Konsole steht nur müll und nicht das was ich mit dem server gesendet hab von C# zu C# klapts wunderbar kann mir jemand sagen wo der fehler im code ist oder mir grade eine c++ pipe bauen die einen einfachen wert empfangen kann
Danke schon mal im vorraus
MFG
Insert-name-here

Kann oder will mir keiner dabei helfen ?
12/31/2011 17:55 Bot_interesierter#6
Es ist vermutlich ein Problem mit dem Stringencoding, wenn du UTF-8 Strings per C# verschickst und diese dann als ANSI ließt kommt einfach nur Kauderwelsch dabei heraus.

Du musst also den String in C++ richtig verarbeiten, benütze also besser einen wchar_t buffer und wcout.