한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › 일부에게만 생기는 문제

고정 UDP 포트 충돌 Two clients bound to the same local UDP port

원인 ID pt-port-collision · 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발

그림과 실험이 있는 원본 카드로 열기 →

클라이언트가 정해진 로컬 포트를 쓰도록 만들어져 있으면, 같은 PC의 두 번째 클라이언트는 포트를 못 쓰거나 첫 번째와 패킷을 나눠 받습니다.

왜 두 클라이언트가 같은 로컬 UDP 포트를 열려고 함(재사용 옵션으로 억지로 공유) → 그러면 OS가 들어온 패킷을 한쪽 소켓에만 넘기거나, 어느 쪽이 받을지 보장하지 않음. 공유기와 서버도 두 클라이언트를 같은 주소로 봄 → 화면에서는 한쪽은 월드 패킷을 못 받아 NPC·다른 플레이어가 안 보이거나 접속이 끊김

증상
안 보임·유령 개체, 접속 끊김, 접속 불가·무한 로딩
요인
손실
누가 겪나
같은 PC의 한쪽 클라만
언제
접속·점검 직후, 항상
담당
주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
클라이언트: 로컬 포트는 OS가 자동으로 고르게(0번 바인드). 서버: 연결마다 발급한 세션 토큰으로 연결 구분.
그래프에서는
일부만 높음 · 클라이언트별 수신 패킷 수
확인할 곳
유저 PC에서 두 클라이언트를 켠 채 명령 프롬프트에서 netstat -ano -p udp로 게임 프로세스(PID)마다 연 로컬 UDP 포트를 봄. 서버 쪽에서는 두 세션이 같은 공인 IP·같은 포트로 들어오는지 확인
이러면 맞음
두 게임 프로세스가 같은 로컬 포트에 묶여 있거나, 서버에서 두 세션이 같은 IP·포트로 보임. 한쪽만 켜면 정상
이러면 아님
두 클라이언트가 서로 다른 로컬 포트를 쓰는데도 한쪽이 이상하면 IP·기기 기준 세션 구분 버그나 멀티 클라이언트 제한
확인 수단
유저 쪽 환경에서 확인

출처

  1. Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE Microsoft
    SO_REUSEADDR로 같은 포트에 두 번째로 bind하면 포트를 가로채고, 어느 소켓이 패킷을 받을지 알 수 없음
  2. bind function (winsock.h) Microsoft
    포트를 0으로 bind하면 동적 포트 범위(49152~65535)에서 고유 포트를 할당
  3. netstat Microsoft
    -a는 TCP·UDP 포트, -n은 숫자 주소, -o는 프로세스 ID(PID), -p udp는 UDP만 표시

함께 보면 좋은 원인

같은 층: 일부에게만 생기는 문제

같은 증상(안 보임·유령 개체)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기