인프런 커뮤니티 질문&답변

gamecoding님의 프로필 이미지

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

채팅 실습

LIst<구조체> 형태의 패킷을 보내는 방법이 있나요?

23.02.12 00:19 작성

·

765

0

List<구조체> 형태를 패킷으로 보낼려고 하는데 BufferWriter부분에서 List<구조체> 데이터를 쓸때 엑세스 위반의 오류가 나오게 됩니다.

List<구조체> 형태의 패킷을 보내는 방법이 있나요?

화면 캡처 2023-02-12 001307.png화면 캡처 2023-02-12 001222.png화면 캡처 2023-02-12 001108.png

답변 2

0

gamecoding님의 프로필 이미지
gamecoding
질문자

2023. 02. 12. 02:24

강사님 정말 감사합니다..

구조체 패딩 문제 였내요...

pragma pack을 사용하니 해결 되었습니다. 감사합니다 !!!

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2023. 02. 12. 02:29

ㅎㅎㅎㅎㅎㅎ 그렇군요 축하드립니다.
저도 한 번 이쪽에서 아주 크게 데인 적이 있어서 남일 같지가 않군요 -_-
헤딩을 오래한 만큼 앞으로 두고두고 기억에 남을겁니다.
그럼 힘내세요

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2023. 02. 12. 00:34

image
이렇게 하면 당연히 큰일납니다.
list, vector 모두 동작 할당된 힙 메모리의 주소를 잠시 들고 있는 것이라
반대쪽에 그런 주소를 보내줘봤자 이해를 못합니다.

우선 bw << players.size() 로 몇 명이 있는지를 보내주신 다음
플레이어 수만큼 for문으로 bw << struct데이터를 넣어주시면 됩니다.
그 부분을 반대쪽에서 파싱해서 size, struct (xsize개)를 꺼내쓰면 되겠죠

gamecoding님의 프로필 이미지
gamecoding
질문자

2023. 02. 12. 01:50

강사님이 말씀하신대로

리스트의 길이를 보내준다음 구조체의 데이터를 bw로 넣어서 클라이언트가 파싱 하는데 클라이언트는 리스트의 길이를 받아올때 이상한 값을 받아오고있어서 질문 드립니다...

화면 캡처 2023-02-12 014716.png화면 캡처 2023-02-12 014658.png

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2023. 02. 12. 01:59

breakpoint를 걸어서 보내는 쪽 데이터를 확인해보시고 (size 포함)
breakpoint를 걸어서 클라에서도 받는 쪽 데이터를 하나씩 확인해보세요.
위 내용만으로는 저도 원인을 알 수 없습니다.
메모리를 까보는 것도 필요할 수 있습니다.

그런데 C# <-> C++ 연동인건가요?
그러면 더 조심할게 많아집니다. (struct Player의 패딩 문제 등)