TCP 버퍼와 C# - Receive함수의 버퍼 관계
2022. 4. 12. 15:02ㆍ카테고리 없음
728x90
환경
에코 서버 및 클라이언트(프로그래밍 언어는 아무 언어나 상관없지만 필자는 C#으로 테스트)
문제 발생 유도
클라이언트의 reveive 버퍼 크기를 작게 할 경우 TCP 버퍼에서 가져올 때 어떤 상황이 발생할까?
테스트
- 서버를 활성화 한 상태에서 유저의 input 신호(예: cmd에 입력창)를 입력 받음(a1b2c3d4e5f6g7h8i9_hello_world 입력)
- byte배열 형식으로 서버에 send
- 서버는 에코 기능으로 클라이언트에게 전달
- 클라이언트는 receive 할때 receive buff 크기를 20으로 고정한다면 버퍼의 크기만큼만 TCP버퍼에서 읽어 들이고 나머지 TCP 버퍼의 값은 클라이언트가 receive 함수를 다시 호출할 때 읽어 들임
결론
너무 적은 버퍼로 읽어 들일 때 메시지 문제가 발생할 수 있다.
그렇다고 클라이언트 버퍼 크기를 무작정 크게 한다고 해결할 수 있는 상황은 아니다.
이유는 사용자 정의 패킷이라 함은 보통 구조체 같은 사용자 형식으로 만들어진 데이터 크기를 알아야 그 용도에 맞게 사용할 수 있지만 버퍼의 크기란 패킷의 크기와 ==(같다)는 상황은 될 수 없기 때문이다.
그리고 네트워크 상에서 데이터를 전송하면 무조건 한 번에 정확한 데이터를 받을 수 있다는 가정도 없기 때문이다.