2012-05-14 3 views
0

이것이 TCPClient 또는 기타인지 확실하지 않은 경우 네트워크 스니퍼를 사용하여 서버에서 보내고받은 것을 확인하고 데이터가 올바르지 만 소프트웨어에서 데이터를 잘못 수신합니다.tcpclient가 데이터를 잘못 수신 함

내가 설명하자면, 나는 확인 바이트 (05)를 보낸다. 나는 ACK를 받았고 (06), 9B 바이트로 시작하는 데이터를 전송했다. 그 바이트 다음에 나는 C5 바이트를 얻어야한다. 그러나 나의 소프트웨어에 따르면 나는 스니퍼에 따라 케이스가 아닌 다른 06 바이트를 얻는다!

byte[] buff; 
if (!this.isConnected()) 
    this.connect(); 

NetworkStream gs = _Socket.GetStream(); 

gs.Write(enq, 0, enq.Length); 
gs.Flush(); 
outputByte(enq, "Trans"); //outputs ---> 05 

buff = new byte[1]; 
gs.Read(buff, 0, buff.Length); 
gs.Flush(); 
outputByte(buff, "Rec");// outputs <--- 06 

if (buff[0] == 0x06) 
{ 
    byte[] data = new byte[] { 
              0x9B, 0x00,   0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x09,   
     0x67, 0x11, 0x01, 0x49, 0x4D, 0x41, 0x47, 0x45,   0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x01, 0x53, 0x75, 0x6D, 0x6D, 0x61, 0x72, 0x79,   
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x08, 0x00,   
     0x00, 0x00, 0x1F, 0x09, 0x01, 0x00, 0x04, 0x0A,   0x10, 0x00, 0x12, 0x01, 0x1F, 0x00, 0x00, 0x00,   
     0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,   0x12, 0x10, 0x1E, 0x0E, 0x1E, 0x54, 0x65, 0x73,   
     0x74, 0x69, 0x6E, 0x67, 0x10, 0x00, 0x12, 0x01,   0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00,   
     0x00, 0x00, 0x00, 0x00, 0x12, 0x10, 0x0D, 0x00,   0x00, 0x90 
    }; 
    outputByte(data, "Trans"); /outputs --> with above byte information 
    gs.Write(data, 0, data.Length); 
    gs.Flush(); 

    buff = new byte[1]; 
    gs.Read(buff, 0, buff.Length); 
    gs.Flush(); 
    // this is the first receive of 06 
    outputByte(buff, "Rec");//outputs <--- 06 

    if (buff[0] == 0x06) 
    { 
     gs.Flush(); 
     Console.WriteLine("fdsfsdfs"); 
     byte[] resp = new byte[5]; 
     gs.Read(resp, 0, resp.Length); 
     gs.Flush(); 
     //this outputs <--- 06 but it should be showing <--- c5000100c4 
     outputByte(buff, "Rec"); 
     gs.Write(ack, 0, ack.Length); 
     outputByte(ack, "Trans"); 
     gs.Flush(); 
    } 
} 

은 스니퍼에 따르면이

---> 05 
<--- 06 
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090 
<--- 06 
<--- c5000100c4 

일어나고 그리고

---> 05 
<--- 06 
---> 9b008000000080000009671101494d414745310000000000000000000000000000000153756d6d617279000000000000000000000000000000000000000000000000000002080000080000001f090100040a100012011f000000050001000000000012101e0e1e54657374696e67100012011f000000050001000000000012100d000090 
<--- 06 
<--- 06 

어떤 아이디어 무슨 일이 일어나고있는 소프트웨어이가에 따라해야 무엇인가? 코드를 개선하는 방법에 대한 어떤 제안이있는 경우 또한, 저는 여기에

+0

제가 말하고 싶은 첫 번째 것은 :'Read' 호출 각각으로부터 결과를 출력 할 수 있습니까? –

+0

@MarcGravell 그게 outputByte 함수가하는 일이며 그게 위의 내용입니다! – Neo

답변

6

감사 할 것 : 잘못된 버퍼를 출력하는 그러나

gs.Read(resp, 0, resp.Length); 
    gs.Flush(); 

    outputByte(buff, "Rec"); <==== should be "resp" 

!

모든 읽기 통화가 끊어졌습니다. 그들은 이어야합니다.은 복수 바이트를 읽을 때 , 특히과 같은 반환 값을 처리해야합니다. 패킷 단편화로 인해 코드가 삭제됩니다.

원래 올바른 "판독 정확히 [N] 바이트"방법이 될 것이다 : 다음

public static void ReadExact(this Stream stream, byte[] buffer, 
      int offset, int count) { 
    int read; 
    while(count > 0 && (read = stream.Read(buffer, offset, count)) > 0) { 
     count -= read; 
     offset += read; 
    } 
    if(count != 0) throw new EndOfStreamException(); 
} 

: 충분하지 않은 데이터 스트림의 경우

gs.ReadExact(resp, 0, resp.Length); 

가 올바르게 작성 또는 에러 것이다.

+1

OMG 이것이 내가 여러 가지 일에 동시에 작업하는 것을 싫어하는 이유입니다. 2 C# 프로젝트 웹 사이트와 수리를위한 2 대의 노트북, Marc이 오류를 전혀 볼 수 없었기 때문에 고맙습니다. 최대한 빨리 구현할 수있는 ReadExact 함수는 쓰기에 대해서도 필요합니까? – Neo

관련 문제