[TIL] 24.11.04 MON

GDORI·2024년 11월 4일
0

TIL

목록 보기
92/161
post-thumbnail

오늘은 발제 및 팀 회의로 인해 시간이 너무 부족했다.
과제를 진행하며 수정한 부분에 대해 적고자 한다.

기존 buffer에서 패킷 읽어오는 법

// 기존 버퍼에 데이터 추가
  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 제출시간 이슈 ㅋㅋ;;)
내일 이어서 작성 하겠다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글