오늘은 발제 및 팀 회의로 인해 시간이 너무 부족했다.
과제를 진행하며 수정한 부분에 대해 적고자 한다.
// 기존 버퍼에 데이터 추가
socket.buffer = Buffer.concat([socket.buffer, data]);
// 전체 헤더 길이 구하기
const totalHeaderLength = config.packet.totalLength + config.packet.TypeLength;
// 버퍼의 크기가 헤더의 길이보다 길거나 같을 때 실행
while (socket.buffer.length >= totalHeaderLength) {
const bufferTotalLength = socket.buffer.readUInt32BE(0);
const packetType = socket.buffer.readUInt8(config.packet.totalLength);
// 소켓 버퍼의 길이가 데이터 총 길이보다 길 때 추출
if (socket.buffer.length >= bufferTotalLength) {
const packet = socket.buffer.slice(totalHeaderLength, bufferTotalLength);
socket.buffer = socket.buffer.slice(bufferTotalLength);
// 패킷처리
} else {
break;
}
}
기존에는 패킷의 크기가 정해져 있어서 위와 같이 미리 정해놓고 부를 수 있었다.
허나, 오늘 시작한 팀프로젝트의 경우 패킷의 크기가 가변이라 위와같이 사용하기 쉽지 않았다.
그래서 찾아본 내용이 위와 비슷하지만 오프셋 개념을 적용하면 가능할 것 같았다.
export const parsePacket = (socket) => {
let offset = 0;
if (socket.buffer.length < offset + config.packet.typeLength) return null;
const packetType = socket.buffer.readUInt16BE(offset);
offset += config.packet.typeLength;
if (socket.buffer.length < offset + config.packet.versionLength) return null;
const versionLength = socket.buffer.readUInt8(offset);
offset += config.packet.versionLength;
if (socket.buffer.length < offset + versionLength) return null;
const version = socket.buffer.slice(offset, offset + versionLength).toString();
offset += versionLength;
if (socket.buffer.length < offset + config.packet.sequence) return null;
const sequence = socket.buffer.readUInt32BE(offset);
offset += config.packet.sequence;
if (socket.buffer.length < offset + config.packet.payloadLength) return null;
const payloadLength = socket.buffer.readUInt32BE(offset);
offset += config.packet.payloadLength;
if (socket.buffer.length < offset + payloadLength) return null;
const payload = socket.buffer.slice(offset, offset + payloadLength);
offset += payloadLength;
// 남은 버퍼를 업데이트
socket.buffer = socket.buffer.slice(offset);
return {
packetType,
version,
sequence,
payload,
};
};
위와 같이 바이트별로 버퍼의 크기가 충분할 경우 오프셋을 이동시키고 아닐 경우 null을 반환하여 원하는 패킷크기만큼
반복하면 얻어올 수 있을 것으로 생각된다.
아직 패킷 처리부분을 완성하지 못해 결과 사진이 없다.(TIL 제출시간 이슈 ㅋㅋ;;)
내일 이어서 작성 하겠다.