[Tcp] 연속적인 정보를 송출시 유의점

 

 

상황 : 키넥트 센서에서 검출된 x , y, z 좌표를 int 형(4byte) 로 클라이언트에게 송출한다.

 

기존코드 :

public void sendByte(Socket client, byte[] data) { if (client.IsBound == false) return; try { NetworkStream ns = new NetworkStream(client); ns.Write(data, 0, data.Length); ns.Flush(); ns.Close(); ns.Dispose(); ns = null; } catch (IOException) { } catch (SocketException) { } }

 

data 에 보낼 정수들을 모아 보낸다.

예)

int[]{123,424,312} ->( BitConverter ) -> byte 배열로 바꾼다.

결과로 , 총 3 * 4 , 즉 크기 12 byte 를 가진 배열이 된다.

 

문제발생 :

정수 3개 를 가진 배열일때 송출되는 바이트 배열 12byte 는 클라이언트로 송출 될때 , 항상 12 바이트를 송출하지 않는다.

크기가 상당히 가변적이다.  따라서 클라이언트는 배열의 크기를 검사하여 12 바이트 이하로 들어오는 정보를 무시하는 코드를 작성하여야 에러를 피할수 있다.

그러나 성능상의 이유나 , 통신상의 이유로 이러한 무시됨이 잦을경우 수신을 문제로 이어 진다.

이를 해결하기 위해 에초에 서버에서 모든 정보를 묶어 한번에 보내는 방법을 생각해내야 한다.

 

 개선된 코드

        public void sendInts(Socket client, int[] data)
        {
            if (client.IsBound == false)
                return;

            try
            {
                NetworkStream ns = new NetworkStream(client);

                byte[] byteData = new byte[data.Length * 4];
                int c = 0;
                for (int i = 0; i < data.Length; ++i)
                {
                    //정수를 바이트로 변환하니 , 플래시에서 이상한 숫자 도출. - 리틀이디언 적용해야함
                    byte[] b =BitConverter.GetBytes(data[i]);

                    for (int j = 0; j < 4; ++j)
                    {
                        byteData[c] = b[j];
                        ++c;
                    }

                }

                ns.Write(byteData, 0, byteData.Length);
                ns.Flush();
                ns.Close();
                ns.Dispose();
                ns = null;
            }
            catch (IOException) { }
            catch (SocketException)
            {
            }
        }

byteData[] 라는 모든 int 정보를 담을 배열을 미리 생성하여 루프를 돌며 순차적으로 int 를 집어넣어 항상

정해진 길이만큼의 byte 를 송출한다.

결과 클라이언트에서는 무시되는(12byte 보다 작은 ) byte 는 전혀 없고 약간의 overbyte (24 byte) 가 보인다.

따라서 지속적인 스트리밍 에서는 위와 같은 방법으로 버퍼를 잡아 한번에 송출하여야 신뢰할수 있는 통신을 할수 있다.

'C#' 카테고리의 다른 글

Activator 를 이용한 Type Instance 생성  (32) 2012.12.29
[Broadcast Video Streaming]  (149) 2012.11.27
[Tcp] 연속적인 정보를 송출시 유의점  (91) 2012.11.04
[MEMO]  (58) 2012.10.14
[WCF] 간단한 채팅 샘플  (61) 2012.05.12
[ASP.NET] 클라이언트가 멀티파트 보내고 서버가 받기  (77) 2012.05.05
Yamecoder 야매코더_
C# 2012.11.04 16:55
Powerd by Tistory, designed by criuce
rss