2009-11-07 2 views
0

VC++와 C# 둘 다 사용하는 프로젝트를하고 있습니다. VC++은 하드웨어 인터페이스 용입니다 (다른 곳에서는 VC++ 만 사용해야합니다). 응용 프로그램 측면에서는 C# (마이크로 소프트 비주얼 스튜디오 2008)을 사용하고 있습니다.VC++ 6.0과 C# Visual Studio 2008 사이의 명명 된 파이프

두 프로그램이 서로 통신하기 위해 나는 명명 된 파이프를 사용하고 있습니다 (이것도 필요합니다).

C#과 VC++ 사이에서 통신 할 수 있지만 VC++에서 C#으로는 통신 할 수 없습니다.

나는 아래 코드를 C#에서 사용하고 있습니다.

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mytestpipe")) 
{ 
pipeStream.WaitForConnection(); 
Console.WriteLine("[Server] Pipe connection established"); 

using (StreamReader sr = new StreamReader(pipeStream)) 
{ 
    while ((temp = sr.ReadLine()) != null)      
    { 
     MessageBox.Show(temp));  
    } 
} 
} 

여기서 문제는 sr.ReadLine()입니다. 전혀 종료되지 않습니다. 일단 null을 발견하면 중지해야하지만 C++에서 VC++에 의해 제공된 null 값은 NULL로 간주되지 않습니다.

이제 어떻게해야합니까?

답변

0

ReadLine은 파일 끝에 도달하면 NULL 만 반환합니다. 데이터를 보낸 후 클라이언트 측에서 파이프를 닫으시겠습니까?

1

C++의 NULL 상수는 실제로는 단지 0입니다. "int"형의 평이한 제로입니다. 특별한 것은 없습니다. 그래서 파이프에 NULL을 쓰면, 그냥 0을 전송하는 것입니다. 그게 전부입니다. 그리고 C# 측은 그것을 읽고있는 문자열의 일부로 0을 정교하게 읽습니다.

에서는 ReadLine는()는 두 경우에 종료한다 : "새로운 라인"시퀀스가 발생한 후

1) (즉, 0x0d로 0x0A이다). 파이프는 두 번째 경우

)가 폐쇄 상태로되면 기본 스트림이 종료

2) (이 경우를 의미하는, 상기 스트림이 폐쇄되기 이전 판독하는 기회를 가졌던 반환 , 이후의 ReadLine() 호출은 null을 반환합니다.

따라서 ReadLine()이 null을 반환하게하려면 VC++ 측에서 파이프를 닫아야합니다.

그러나 나는 이것이 당신이하려는 일이 아니라고 생각합니다. 따라서, 제 조언은 먼저 통신에 사용할 프로토콜을 먼저 개발하고 신중하게 지정해야만 실제로 수신 및 송신 측을 코딩해야합니다.