안녕하세요
유닉스서버와 델파이클라이언트를 이용해 온라인게임을 만들고 있습니다.
다른것들이야 노력해서 될 것이지만,
어려운것이 역시나 소켓프로그래밍이네요.
기본적으로 접속하고 데이타 주고 받고 끊는 것 모두 정상적이긴 한데요.
한 클라이언트에 다수의 다른 클라이언트의 데이타를 받는 경우
맨 마지막 데이타만 남고 나머지는 사라지는 군요............
두 사람이 좌표를 받고 로긴한경우
서로의 데이타를 받구요.
또 한사람이 더 들어오는 경우
전의 두사람에게 새로운 사람 데이타를 보내고 받는데까지는 이상이 없는데...
새로운사람에게 전의 두사람의 데이타를 넘길경우
한사람의 데이타는 어디론가 사라지고 없군요.
3사람이상의 데이타도 마찬가지입니다.
새로운 사람의 경우 마지막 받은 데이타만 받고 나머지는 어디론가
사라집니다.
검색해서 읽어보니까 두라인이상의 글을 받을 수가 없다는 얘기가 있던데...
이유와 해결방안이 있을까요?
온라인게임이기때문에 데이타를 최대한 붙여 보내고 받는다고 쳐도
그런경우를 피할 수는 없기 때문에 막막합니다.........
도움부탁드려요.......
TClientSocket를 이용했구요, 논블럭킹모드입니다.
그리고 아래는 패킷을 읽는 부분입니다.
처리하는 wpt1부분에 데이타가 오면 일단 왔다는 것을 표시하도록
했는데요. 역시 데이타가 유실되는게 맞는거 같습니다.
procedure TMainForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var s: string;l: integer;
begin
l := Socket.ReceiveLength;
SetLength(s, l);
Socket.ReceiveBuf(s[1], l);
case s[1] of
x_pt1 :wpt1(s);
x_pt2 :wpt2(s);
x_pt3 :wpt3(s);
x_pt4 :wpt4(s);
end;
end;
서버가 정상적으로 작동한다는 전제하에서 말씀드리겠습니다.
받은 데이타를 다른 함수에 넘겨주게되면 이벤트가 계속 물려있게 되죠.
처리하기 전에 데이터가 들어오구 또 들어오구... 그러면 생각하신대로 처리가 안되겠죠.
이걸 해결할려면 소켓 버퍼를 빨리 비워주시면 될것 같습니다.
큐를 하나 만들고 데이터를 받자마자 큐에 넣어주세요.
TQueue 를 사용하시면 될것 같네요.
Queue.Push(Item: Pointer);
꺼내실때는 Queue.Pop 입니다.
그리구 큐에 있는 데이타를 꺼내서 처리해 주시면 될 것 같습니다.
주고 받고 하면 데이터가 붙어서 올 일이 없겠지만 데이터가 붙어서 올 경우엔 정하신대로 잘라서 사용하시면 되구요.
참고로 한번에 받는 데이타 사이즈가 8k가 넘으면 안됩니다. 소켓이 뻗습니다...그게 싫으시면 winsock api로 직접 소켓을 만드셔도 되구요. 예제 소스도 많이 나와있습니다.
그럼 오늘도 즐겁게 보내시길...^ ^;