Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

rabbit97 님의 블로그

15일 일지 본문

프로젝트 Final

15일 일지

rabbit97 2024. 11. 16. 16:04

오늘의 회의 내용

 

# 추가 기능 구현 사항을 구체적으로 어떻게 적용할껀지

  -

  • 속도 조절
    • Shift 키를 누르면 캐릭터 속도가 빨라지며, 이 상태에서 일정 시간이 지나면 일반 속도보다 느려진다. (일반: 3, 빠름: 5, 느림: 2) (현재 클라이언트 쪽에 추가로 구현되었고, UI 쪽을 추가하여 유저가 보기 쉽게 변경할 수 있도록 고려 중…) (서버 쪽에서도 검증하는 작업이 필요할 것으로 보임)
  • 카드 추가
    • 백병전 상대한테 빵야가 있을 시, 내 HP 1 감소, 없을 시, 상대는 2 감소 심리전으로 사용할 수 있지 않을까?
    • 프렌드 쉴드 내가 맞은 빵야를 다른 사람이 맞도록…
    • 폭탄 해제
    • 함정 나에게 빵야 한 사람이 오히려 HP가 깎이는 것
  • 데일리 미션 서로 안 죽이는 이벤트 쪽으로… 예를 들어, 특정 물건을 빈 건물에다가 두기, 길거리의 쓰레기/몬스터 치우기? 아니면 맵에 있는 가로등 다 키기 vs 끄기…
  • 편의 기능? 끊어져 있는 길들이 서로 연결되도록… 즉, 막다른 길로 쭉 가면 자연스레 반대 쪽에서 나올 수 있도록,,, 통로 별로 포탈 느낌의 무언가를 추가 해야할 듯….

 

진행 상황

 

# 스켈레톤 코드 작성 중 onData 파일에서 알 수 없는 문제 발생

 

import CustomError from './../utils/errors/customError.js';
import ErrorCodes from './../utils/errors/errorCodes.js';
import config from './../config/config.js';
import validateSequence from './../utils/socket/sequence.js';
import packetParser from './../utils/packet/parser/packetParser.js';
import { getHandlerByPacketType } from './../handlers/index.js';
import handleError from './../utils/errors/errorHandler.js';

const onData = (socket) => async (data) => {
  if (!socket) {
    throw new CustomError(ErrorCodes.SOCKET_ERROR, `소켓을 찾을 수 없거나 연결이 끊겼다.`);
  }

  socket.buffer = Buffer.concat([socket.buffer, data]);

  const totalHeaderLength = config.packet.totalHeaderLength;
  while (socket.buffer.length >= totalHeaderLength) {
    // 1. 패킷 타입 길이만큼 버퍼 읽을 위치 지정
    let offset = 0;

    // 2. 패킷 타입 - 핸들러 (2 bytes)
    const packetType = socket.buffer.readUInt16LE(offset);
    offset += config.packet.payloadOneofCaseLength; // 2

    // 3. 클라이언트 버전 길이 (1 byte)
    const versionLength = socket.buffer.readUInt8(offset);
    offset += config.packet.versionLength; // 1

    // 4. 클라이언트 버전 (versionLength bytes)
    const version = socket.buffer.subarray(offset, offset + versionLength).toString('utf-8');
    offset += versionLength;
    // 4-1. 버전이 일치하는지 검증
    if (version !== config.client.version) {
      throw new CustomError(
        ErrorCodes.CLIENT_VERSION_MISMATCH,
        '클라이언트 버전이 일치하지 않습니다.',
      );
    }

    // 5. 패킷 시퀀스 (4 bytes)
    const sequence = socket.buffer.readUInt32LE(offset);
    offset += config.packet.sequenceLength;
    const isValidSequence = validateSequence(socket, sequence);
    if (!isValidSequence) {
      throw (
        (new CustomError(ErrorCodes.INVALID_SEQUENCE),
        `패킷이 중복되거나 누락되었다: 예상 시퀀스: ${socket.sequence + 1}, 받은 시퀀스: ${sequence}`)
      );
    }
    // 6. 페이로드 길이 (4 bytes)
    const payloadLength = socket.buffer.readUInt32LE(offset);
    offset += config.packet.payloadLength;

    if (socket.buffer.length >= payloadLength + totalHeaderLength) {
      // 7. 페이로드 (payloadLength bytes)
      const payloadBuffer = socket.buffer.subarray(offset, offset + payloadLength);

      try {
        const { payload } = packetParser(payloadBuffer);

        socket.buffer = socket.buffer.subarray(offset + payloadLength);
        const handler = getHandlerByPacketType(packetType);
        await handler({ socket, payload });
        break;
      } catch (error) {
        handleError(socket, error);
        break;
      }
    }
  }
};

export default onData;

 

5번. validateSequence() 쪽에서 패킷 누락

 

이유 확인 불가 주말동안 해결하고 월요일에 개발 시작할 수 있도록 하기

'프로젝트 Final' 카테고리의 다른 글

19일 일지  (0) 2024.11.19
18일 일지  (0) 2024.11.18
14일 일지  (0) 2024.11.14
13일 일지  (2) 2024.11.13
최종 프로젝트 시작  (1) 2024.11.13