[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를 두번 읽어야 하는 비효율 이다.
'C#' 카테고리의 다른 글
[lamda] 메서드 안에 이벤트 핸들러 선언하기 , 삭제가능 (내장 Delegate) (98) | 2012.04.05 |
---|---|
EnCrypto / DeCrypto (77) | 2012.03.09 |
[socket] header 정보의 byte length를 미리 알아보자 (103) | 2012.03.06 |
[C# Socket ] 파일전송중 Client 가 죽은것 알아채기 2 (135) | 2012.02.12 |
[TCP 파일전송] [서버의 접속클라이언트 스레드풀] (110) | 2012.02.12 |
[LINQ to SQL] (111) | 2012.02.02 |
C#
2012.03.06 14:11