소켓으로부터 바이트 스트림을 받음
->
단순 에코서버가 아닌 유의미한 애플리케이션 프로토콜을 만들려면, 메시지 경계를 파싱해야함
->
버퍼 활용성 올릴려면 링버퍼 써야하는데
그러면 마지막에 바이트스트림이 끊기는 경우를 생각해야함
->
나의 생각
1. 고정 바이트 헤더를 써서
헤더길이 만큼의 바이트를 먼저 받고, 헤더 읽어서 페이로드 길이 알아냄, 페이로드 길이만큼 바이트 수신하고, 다시 다음 메시지. 헤더만큼 수신을 대기함 => 수신이 여러번 호출됨
2. 링버퍼 쓰다가 메시지 바이트 연속성이 끊기면 해당 부분만 복사
길이 10인 메시지인데, 버퍼 마지막에 5개 바이트가 찼고,
버퍼 앞부분에서 그 뒤 5개 바이트가 찼으면
어떤게 복사해서 바이트 이어 붙인 뒤 사용
3. 소켓에 할당한 버퍼에서 따로 바이트 복사 해가지고 메시지 조립을 함. 복사비용 생김
나의 하찮은 머리론 이정도밖에 생각이 안 나는데 훈수점
보통 링버퍼에 고정 헤더 파서 하잖아 수신은 링버퍼가 하고, 파싱은 FSM으로 함
메시지 경계가 본문처럼 나뉘는 경우, 해당 메시지 주소를 바로 사용할 수가 없으니 그 때의 처리를 물어보는거에요
해당 버퍼가 다시 쓰이기 전에, 메시지를 완전히 소비한다는 가정 하에 추가적인 복사 없이 직접적으로 사용하는 방법 쓰고싶어서
@ㅇㅇ(211.235) 그니까 메세지가 분할되서 연속으로 처리 못하면 임시 버퍼로 복사한 후에 해
@ㅇㅇ(211.235) 그것도 아니면 그냥 scatter/gather I/O라는게 있을껄? 이거는 나도 자세한건 모름
소켓에 할당한 버퍼의 주소를 바로 메시지로 사용하는건 우케 생각함. 동시성 컨트롤만 잘 해놓으면 문제 없나
@ㅇㅇ(211.235) 내 생각에 그건 사고 날게 백프로라 생각함. 예외처리가 상당히 어려울듯
해당 댓글은 삭제되었습니다.
@나르시 호동피티네