죄송합니다.
델파이2010에 인디 10인데요.
소스코드의 타임아웃시간은 질문에 올린 그대로입니다.
소스코드에는 200으로 응답시간을 설정했는데
처음에 10번쩨 클라이언트 생성될때, 그 이후부터는 5대씩 나뉘어 응답대기시간이 30초가 됩니다.
제가 보기엔 응답을 기다리는게 아니고 뭔가 하는것 같습니다.
그게 이해가 안되서 질문 올린거구요.
소스코드는 질문에 올린 코드 이외에는 없구요.
그리고 말씀하신 내용 중 쓰레드로 처리하라고 하셧는데요.
제가 전문 프로그래머가 아니고 문법만 조금 알고 있는데 어쩌다가 소켓프로그래밍을 해야 하는 상황이 되어 질문을 올리거든요. 그냥 남이 짜 놓은 프로그램 짜집기 해서 완성하는 정도의 실력뿐입니다.
쓰레드가 뭔지는 대충 알고 있지만 그걸 이용해서 구현하는 방법은 감을 잡지 못하고 있습니다.
샘플코드라도 있으면 대충 어떻게 해볼것 같은데요.
인터넷에 나와 있는 샘플코드들은 모두 복잡해서 못알아 보겠더라구요.
어려운 부탁이지만 여유가 있으시면 아래에 있는 소스코드를 쓰레드처리 할 수 있도록 수정해 주시면 감사하겠습니다.
procedure TForm1.Button1OnClick(Sender: TObject);
var
Client : Array of TIdTCPClient;
IPAddr : String;
i : Integer;
Begin
for I := 0 to ListBox1.Count - 1 do
Begin
IPAddr := ListBox1.Items.Strings[i];
Client[i] := TIdTCPClient.Create(Application);
Client[i].ConnectTimeout := 200;
Client[i].IPVersion := Id_IPv4;
Client[i].Port := 97;
Client[i].Host := IPAddr;
TRY
Client[i].Connect;
Client.IOHandler.WriteLn('Hellow?');
Client[i].Disconnect;
Except
Memo1.Lines.add('Error : ' + IPAddr);
END;
End;
End;
kylix 님이 쓰신 글 :
: TCP Client가 연결하는데 서버가 응답하지 않으면 클라이언트는 ConnectTimeout될때까지 대기하고 있죠. 인디는 블로킹방식이기 때문에 대기중에는 그 다음행이 실행이 안됩니다.
:
: 배열이건 리스트건 데이터구조하고는 상관이 없습니다.
: smooth하게 처리하실려면 timeout을 줄이거나 쓰레드로 처리하세요.
:
: timeout이 코딩하고 질문하고 다르군요. 아마도 인디 9버전 쓰시는것 같은데 9버전의 최신판으로 업그레이드하세요. ConnectTimeout이 제대로 안 먹는것은 예전버전의 버그입니다.
:
: 김수정 님이 쓰신 글 :
: : 아래 소스코드를 봐주세요.
: :
: : ....
: : VAR
: : Clien : Array of TIdTCPClient;
: : ....
: : ....
: :
: : procedure TForm1.FormCreate(Sender: TObject);
: : var
: : IPAddr : String;
: : i : Integer;
: : Begin
: : .....
: : .....
: : for I := 0 to ListBox1.Count - 1 do
: : Begin
: : IPAddr := ListBox1.Items.Strings[i];
: :
: : Client[i] := TIdTCPClient.Create(Application);
: : Client[i].ConnectTimeout := 200;
: : Client[i].IPVersion := Id_IPv4;
: : Client[i].Port := 97;
: : Client[i].Host := IPAddr;
: : TRY
: : Client[i].Connect;
: : Except
: : Memo1.Lines.add('Connect Error : ' + IPAddr);
: : END;
: : End;
: : End;
: :
: :
: : 폼이 생성될때 클라이언트를 만들어 넣어주고 connect하는데요.
: :
: : 10개 이상의 클라이언트를 생성하려 하면 문제가 생깁니다.
: : 처음엔 10개의 TIdTCPClient가 생성되고 30초 동안 아무것도 안움직이고 멈춰있습니다.
: : 그 다음 부터는 5개가 생성된 다음 30초씩을 기다려야 추가로 또 5개씩 생성됩니다.
: :
: : 그뿐이 아니예요.
: : 간혹 서버는 문제가 없는데 Connect가 안되는 경우가 불규칙하게 발생합니다.
: :
: : TIdTCPClient를 배열로 하지 않고 TObjectList 또는 TComponentList에 넣어서 해봐도 마찬가지입니다.
: : 이 문제를 해결할 수 있는 방법을 알려주시면 감사하겠습니다.
|