[socket] header 정보의 byte length를 미리 알아보자



기존에는 header 정보를 보낼때 1024 , 2048 , 등등의 header byte를 서버와 클라이언트가 약속하여 보냈다.

따라서 클라이언트가 보내려는 바이트가 1개 이든 100개 이든 무조건 1024 개를 억지로 맞추어 보냈다.

불필요 했다.

한가지 과정만 서버에 보태어 진다면..


<Process>

클라이언트 접속

RowBuffer 바이트배열에 클라이언트로 부터 받은 모든 바이트를 넣는다(client.Receive(Rowbuffer))

RowBuffer 에 유요한 바이트가 몇개인지 체크한다. (바이트가 "0" 이상 일때)

체크된 수 만큼 실제 headerBuffer 바이트배열을 생성한다

headerBuffer 에 RowBuffer 를 1:1 삽입한다.




※ 그냥 RowBuffer를 인코딩하여 읽었다가는 해당 Thread가 먹통이 된다.


 
private void acceptClient(IAsyncResult ar)
        {
            if (isDispose == true)
                return;

            Console.WriteLine("connect!" + Thread.CurrentThread.ManagedThreadId);

            Socket client = server.EndAccept(ar);

            //row버퍼 생성
            byte[] headerbuffrow = new byte[client.SendBufferSize];

            //row버퍼 삽입
            client.Receive(headerbuffrow);

            //row버퍼 크기 체크
            int headerByteCount = 0;
            for (int i = 0; i < headerbuffrow.Length; ++i)
            {
                if (headerbuffrow[i] > 0)
                {
                    ++headerByteCount;
                }
            }

            //row버퍼 크기만큼 실제 headerBuff 생성
            byte[] headerbuff = new byte[headerByteCount];
            for (int i = 0; i < headerbuff.Length; ++i)
            {
                 headerbuff[i] = headerbuffrow[i];
            }

            //읽기
            string readStr = Encoding.Default.GetString(headerbuff).TrimEnd();
            Console.WriteLine(readStr);
            Console.WriteLine("end!");

            client.Disconnect(false);
            client.Close();
        }



약점은 rowHeader를 두번 읽어야 하는 비효율 이다.

Yamecoder 야매코더_
C# 2012.03.06 14:11
Powerd by Tistory, designed by criuce
rss