2016-11-14 11 views
0

chatroom 응용 프로그램을 만들고 서버와 클라이언트 간의 통신을 위해 TCP 패킷을 보냅니다.C# - 한 번에 두 개의 TCP 패킷을 수신하는 것으로 보입니까?

나는 다음과 같은 코드를 가지고 : 클라이언트가이를 읽을 때 그러나

string returnMessage = "[EVT]USERSUCCESS"; 
       bytes = Encoding.ASCII.GetBytes(returnMessage); 
       info.WriteToStream(bytes); 

       foreach (ConnectionInfo con in connections) 
       { 
        info.WriteToStream(bytes); 
        bytes = Encoding.ASCII.GetBytes("[EVT]USERJOIN;" + username); 
        con.WriteToStream(bytes); 
       } 

를, 응답은 다음과 같습니다

  • [EVT] USERSUCCESS [EVT] USERJOIN는,
이름

마치 한 번에 두 패킷을 받고있는 것 같습니다.?

static void ServerListener() 
    { 
     while (true) 
     { 
      byte[] bytes = new byte[1024]; 
      int numBytes = stream.Read(bytes, 0, bytes.Length); 
      string message = Encoding.ASCII.GetString(bytes, 0, numBytes); 

      if (HandleResponse(message) && !WindowHasFocus()) 
      { 
       player.Play(); 
      }  
     } 
    } 

별도의 스레드로 실행됩니다 :

내가 수신을 위해 가지고있는 코드입니다. HandleResponse()가 완전히 작동합니다.

미리 감사드립니다.

답변

3

Tcp는 패킷 프로토콜이 아닌 스트림 프로토콜입니다.

당신이하고있는 것처럼 다중 패킷 또는 단일 패킷으로 바이트를 얻을 수 있습니다.

당신은 Psudeo 코드

(예 : 널 바이트로) 패킷의 끝을 siginifies 바이트를 넣어해야 할 일은 :

  1. 은 당신이받은 모든 바이트를 추가 버퍼를 가지고 .
  2. 버퍼에서 null 바이트 인 경우 널 바이트로 버퍼를 분할하십시오.
  3. 왼쪽을 완전한 패킷으로 처리하십시오. 새로운 널 바이트가 생길 때까지 버퍼의 오른쪽을 유지하십시오.

고급 TCP :

  1. 당신은
+0

그래서 각 패킷의 끝에 널 바이트를 추가하는 것은 클라이언트를 야기 당신의 "패킷"에 체크하여 자신의 오류를 추가 할 수 있습니다 각각 하나씩 읽으시겠습니까? – Sulphate

+0

아니요. 서버 코드를 패킷으로 분할하여 작성해야합니다. – Catprog

+0

어떻게하면됩니까? 나는 이것에 아주 새롭다. – Sulphate