Q&A

  • 인디 소켓 클라이언트의 Recive data 유실(간혹 발생)..?
안녕하세요
소켓 프로그램에서 어려운 문제가 발생되어 질문을 드립니다


프로그램 구조는 채트형 프로그램인데요
인디를 사용했구요

* 서버 프로그램 구조 :
  특정 클라인트에서 소켓 서버로 data를 전송하면
  서버는 연결되어 있는 모든 소켓 클라이언트에 동일한
  메세지를 뿌려 주는 구조입니다

* 클라이언트 구조 :
  클라이어트 프로그램 시작시 서버에 connect 되어 하루 종일 연결되어
  서버에서 보내 주는 data를 받기 위해 쓰레드를
  이용하여 항상 감시를 하고 있다가 data 가 들어오면 필요한
  프로시저를 수행합니다 (프로그램 종료시 disconnect)

  
* 문제는 모든 클라이언트가 서버로 부터 동일한 data를 받아야 되는데
   불 특정 클라이언트에서 data를 받지 못하는 경우가 있습니다..

  아래는 서버와 클라언트 프로그램의 부분 소스입니다

---------------------- 서버 소스 -------------------------------
procedure TFMserver.ServerExecute(AThread: TIdPeerThread);
var
  Msg: String;
begin
  while AThread.Connection.Connected do begin
    Msg := AThread.Connection.ReadLn;
    Broadcast(Msg);
  end;
end;
---------------------- 서버 소스(broadcast) ---------------------
procedure TFMserver.Broadcast(Msg: String);
var
  i: Integer;
  ClientList: TList;
begin
  ClientList := Server.Threads.LockList;
  try
    for i := 0 to ClientList.Count - 1 do
      TIdPeerThread(ClientList.Items[i]).Connection.Writeln(Msg);
  finally
    Server.Threads.UnlockList;
  end;
end;
---------------------- 클라이언트 소스 -------------------------
// 프로그램 activate 시 소켓클이언트가 서버에 connect 되어
// 아래의 쓰레드가 실행되며 프로그램 종료시 disconnect 될때
// 쓰레드 종료 됩니다
procedure TMyThread.Execute;
begin
  while (not Terminated)  do begin
    try
      Msg := Fmmain.Client1.ReadLn;
      Synchronize(View);
    except
      Terminate;
    end;
  end;
end;


  
* 제 생각에는 서버와 클라이언트가 하루 종일 연결되어 있는 구조가
  문제가 되질않나 생각됩니다, 라인에 문제가 발생 될수도 있고, 등 .
  여러가지 문제점이 있을수 있을것 같습니다
  이런 구조로는 data가 유실될수 밖에 없는지 ??,.

* 모든 클라이언트에서 data 유실 없이 다 받을수 있는 안전한 구조가
    무었인지 알고 싶습니다
  
  여러분의 도움을 부탁드립니다.
1  COMMENTS
  • Profile
    박서규 2003.07.14 09:38
    답변이 될련지는 모르겠는데여,,,

    인디나 다른소켓도 마찬가지일 수도 있는데여,,

    ADSL의 경우는 일정시간 소켓의 자료흐름이 일정시간

    없으면 소켓이 끊기는것처럼 보이는 수가 있서여,,

    그래서,, 음,, 젤 좋은건,,,

    서버에서는 클라이언트에서든,,, 일정 간격으로,,

    "내가 살았어여..."라는 의미의 짤막한 메시지를 보내거나..

    받는것도 더 나아질 수 있는 방법일 수 있습니다..

    물론 소켓통신이라는것은 여러가지 미묘한 문제를 발생시키기

    때문에 정확히 어떤상황에서 못받는건지는 체크를 해봐야하지요..

    보내는애가 안보냈는지.. 아님.. 보내는쪽에서 로그를 쌓았을때

    예외가 발생했는지... 아니면 끊김이 발생했는지등등,,

    단순히 못받는다라는것은 여러가지 경우때문에 근본적인

    접근이 안될 수 있습니다.. 그럼..