저번에 만들던 게임인 범버맨에서 네트워크로 플레이하는 것이 문제가 생겨 질문을 드립니다.

안군님의 경고해 주신 문제가 발생했습니다. "쓰레드는 왠만하면 쓰지 마라" 이 말씀을 해주셨었는데요.

어차피 네트워크로(TCP) 게임을 하면 상대방에서 언제 올지 모르는 데이타 때문에 recv 관련 쓰레드는

꼭 돌아야 합니다. 상대방에서 일어나는 이번트에 대해 동기화를 시켜줘야 하는데 recv 관련 쓰레드와

원래 프로그램의 주 메인 무한루프가 같은 자원을 건드리는 것때문에 문제가 생겼습니다. CriticalSection

으로 해결한다고 노력했는데 문제가 생기더라구요. 게임 플레이 도중 생기는 문제는 다음과 같습니다.

네트워크로 플레이를 하는 도중 잘 되다가 상대방의 화면에서 Debug Assertion Failed(맞나;) 라는 에러

가 뜹니다. 그런데 제 화면에서는 에러가 안 뜨고 잘 돌아갑니다. 에러가 뜬 상대방이 제 컴퓨터를 보면서

키 조작을 하면 정상적인 플레이가 됩니다. 즉, 게임의 메인 루프가 살아있어서 키 이벤트를 네트워크로

전송하는 것입니다. 제가 소스 중에 CObArray 라는 것을 쓰는데요 여기에 폭탄 객체를 삽입하고 시간

되면 삭제하고 그렇게 합니다. 그리고 게임 메인 루프마다 현재 CObArray의 모든 폭탄을 GetSize로

구한 정수만큼 for문이 돌면서 그려줍니다. 제 생각으로는 게임 메인 루프에서 이 for문이 실행되는

도중에 recv하는 쓰레드에서 상대방이 보내주는 폭탄 삭제를 보내면 CObArray에서 삭제하게 되어서

GetSize로 구한 정수가 틀려지게 되면서 없는 폭탄을 그릴려고 하다가 그 객체가 없으니까 에러가

뜨는 거 같습니다. CObArray를 쓰게 된 이유는 없습니다;; 어디서 쓰길래 그냥 가져와서 쓰고 있습니다.

1. 혹시 위 상황에 맞는 자료구조 있으면 좀 알려주세요ㅠ.ㅠ 자바에서 Iterator라는 것은 GetSize처럼 그

크기를 가져와서 for문을 돌리는 것이 아니라 for문에서 다음 장소에 객체가 있는지 없는지 확인하고

루프가 도는 방식이 있는데 C 언어에서는 비슷한 거 없나요? 직접 구현해야 하나요?

2. CObArray의 멤버 함수중에 removeAt(i) 이런 것이 잇는데 i번째 위치를 삭제하면 i 이후에 있는

포인터들은 앞으로 당겨지나요??

읽어주셔서 감사합니다 꾸벅(__)

ps. 이번에 네트워크 관련된 글을 작성하면서(학과책자에 내는..;;;) 정수형이나 실수형을 보내고 받는

방법을 알게 되었습니다.

double fl = 14.444;
send(client_sock, (char *)&fl, sizeof(fl), 0);

위와 같이 보내고

double fl2;
recv(client_sock, (char *)&fl2, sizeof(fl2), 0)

이렇게 받을 수 있더군요.. 정수형도 위 같은 방법으로 하면 되더라구요.. 전 지금까지 정수형을 보내려면

그 정수를 itoa 써서 문자열로 변환하고 send 한다음에 상대방에서 문자열에 recv하고 그걸 atoi 해서

써야만 하는 줄 알고 그렇게 하고 있었거든요.. 완전 삽질했다는 ㅠ.ㅠ