2017-12-21 25 views
1

named pipes으로 서로 통신 할 수있는 두 개의 콘솔 앱이 NuGet에서 다운로드 할 수 있으며, small example here을 찾았습니다.두 개 이상의 바이트를 전달하는 방법

콘솔 APP1 :

static void Main(string[] args) 
{ 
    SendByteAndReceiveResponse(); 
}  

private static void SendByteAndReceiveResponse() 
{ 
    using (NamedPipeServerStream namedPipeServer = new NamedPipeServerStream("test-pipe")) 
    { 
     namedPipeServer.WaitForConnection(); 
     namedPipeServer.WriteByte(1); 
     int byteFromClient = namedPipeServer.ReadByte(); 
     Console.WriteLine(byteFromClient); 
    } 
} 

Consoleapp2 : 내 질문

static void Main(string[] args) 
{   
    ReceiveByteAndRespond(); 
} 

    private static void ReceiveByteAndRespond() 
{ 
    using (NamedPipeClientStream namedPipeClient = new NamedPipeClientStream("test-pipe")) 
    { 
     namedPipeClient.Connect(); 
     Console.WriteLine(namedPipeClient.ReadByte()); 
     namedPipeClient.WriteByte(2); 
    }    
} 

:가 어떻게 하나 개의 변수 이상의 바이트 이상의 이상을 전달할 수 있습니다?

+0

스트림이므로 StreamWriter 또는 TextWriter로 래핑하십시오. 또한 프로토콜과 같은 프로토콜을 제안해야합니다. 각 패킷 앞에 길이를 붙입니다. –

답변

3

Write 메서드를 사용하면 여러 바이트를 쓸 수 있습니다. 문제는 수신 측에서 길이를 모르기 때문에 서버에 전달해야한다는 것입니다.

이 코드는 서버 코드입니다. 바이트를 클라이언트로 보냅니다. 다음 내용 첫째, 다른 측면에서 그런

byte[] bytes = new byte[] { 1, 2, 3, 4 }; 
int length = bytes.Length; 

byte[] lengthAsBytes = BitConverter.GetBytes(length); 
namedPipeServer.Write(lengthAsBytes, 0, 4); // an int is four bytes 

namedPipeServer.Write(bytes, 0, length); 

길이를 읽고 :

byte[] lengthAsBytes = new byte[4]; // an int is four bytes 
namedPipeServer.Read(lengthAsBytes, 0, 4); 

int length = BitConverter.ToInt32(lengthAsBytes, 0); 

byte[] bytes = new byte[length]; 
namedPipeServer.Read(bytes, 0, length); 
+1

"int는 2 바이트입니다"? 내가 마지막으로 확인한 시간은 아니었다. –

+0

Ahum. 나는 오버 헤드를 최소화하기 위해 먼저 ushorts를 사용했다. 나는 매우 당혹 스럽다. @Damien_The_Unbeliever –

0

당신은 byte을 만들 수 있습니다 첫째는 많은 바이트가 콘텐츠를 기록, 오는 방법에 대해 설명합니다 형식 배열은 원하는만큼의 바이트로 초기화합니다. 루프 내에서 namedPipeServer.Write(byte[] buffer, int offset, int count)을 사용하여 모든 배열 요소를 반복합니다.