저는 지금 서버에서 esql-c 로 구성된 데몬을 구성하고
델파이로 각가의 클리아언트를 작성하여 소켓프로그램을 짜고있는데요, 그런데
하나의 클라이언트가 서버와 통신을 할경우는 문제가 되질 않는데
두개의 클리아언트가 동시에 작업을 할경우, 데이타가 끊긴다거나, 에러가 나기도 하고,
하나가 물고있으면 다른하나는 계속 대기하다가 timeout 이 걸리는 상황이 발생합니다.
아시는 계시문 조언좀 부탁드립니다...
참고로 저는 Tpowersocket 으로 클리아언트를 구성하였읍니다...
그리고 클라이언트 프로그램을 폼단위로 dll로 구성하고, 또 소켓모듈은 따로 dll로 만들어서 공통으로 사용하고 있는데.. 이것때문인지... 잘모르겠네요...?
<< 클라이언트 소켓모듈 >>
////////////////////////////////////////////////////////////////////////////////
//// 소켓 초기화 함수 /////
//// client : 파워소켓명 loc : directoy명 /////
////////////////////////////////////////////////////////////////////////////////
function GF_SetClientSocket(Client : TPowerSock; loc : string) : boolean;
var
INI : TIniFile;
begin
result := True;
try
INI := TIniFile.Create(loc);
Client.Host := INI.ReadString('value', 'address', '192.168.20.12');
Client.Port := INI.ReadInteger('value', 'port', 6001); // GN_SOCPORT);
Client.ReportLevel := 1;
Client.Timeout := GN_SOCTIMEOUT;
INI.Free;
except
result := false;
client.Destroy;
Client.Close(6001); //GN_SOCPORT);
end;
end;
////////////////////////////////////////////////////////////////////////////////
//// 소켓 send /////
//// client : 파워소켓명 /////
//// msg : send message /////
////////////////////////////////////////////////////////////////////////////////
function GF_SendClientSocket(var s_ReceiveStr: ansistring; var SENDHEAD_VAR: SENDHEAD_REC; msg : string): String;
var
s_Sendstr: String;
s_rtnstr: String;
s_Str1: String;
i_Lenstr: integer;
i_Maxnum: integer;
i_nam: integer;
ii: integer;
soc : TPowersock;
begin
soc := TPowersock.Create(Application);
s_ReceiveStr := '';
result := '333';
try
sleep(20);
if false = GF_SetClientSocket(soc,SOCKET_PATH) then Exit;
ii := 0;
while ( soc.Connected = false) do
begin
ii := ii + 1;
soc.abort;
soc.Connect;
if ii = 99 then exit;
end;
soc.write(s_Sendstr);
s_rtnstr := soc.Read(100);
result:= Copy(s_rtnstr, 4, 3);
SENDHEAD_VAR.SEND_DATE := Copy(s_rtnstr, 14, 8);
s_Str1 := Copy(s_rtnstr, 97, 4);
i_Lenstr := strtoInt(s_Str1);
i_Maxnum := i_Lenstr div 256;
i_nam := i_Lenstr mod 256;
if i_Maxnum > 0 then
begin
for ii := 1 to i_Maxnum do
begin
s_ReceiveStr := s_ReceiveStr + soc.Read(256);
end;
end;
if i_nam <> 0 then
s_ReceiveStr := s_ReceiveStr + soc.Read(i_nam);
Except
begin
if soc.Connected = True then
soc.disConnect;
//soc.Free;
soc.Close(6001);
soc.Destroy;
Exit;
end
end;
if soc.Connected = True then
soc.disConnect;
soc.Close(6001);
soc.Destroy;
end;
아마도 서버에서 문제가 있는 것 같군요...
여러 클라이언트가 접속을 하게 하기위해서는 그만큼 서버에서
여러 클라이언트를 지원하도록 코딩을 해주어야 겠죠...
서버 데몬이 어떻게 구성되어 있는지 잘은 모르겠지만,
만약 델파이로 서버를 만든다면, 클라이언트의 요청때마다,
클라이언트의 요청을 처리하는 쓰레드를 작성해서, 각 쓰레드로
위임을 해야 겠지요...
유닉스 환경에서 구현한 서버라면, 자식 프로세스를 생성할 수도 있고,
아니면, 그외 비동기 함수를 이용해서 할 수도 있겠죠.. ^^;
자세한 구현방법은 저도 해본지가 오래되서리~
암튼 도움이 되셨길~
김현석 wrote:
> 저는 지금 서버에서 esql-c 로 구성된 데몬을 구성하고
> 델파이로 각가의 클리아언트를 작성하여 소켓프로그램을 짜고있는데요, 그런데
> 하나의 클라이언트가 서버와 통신을 할경우는 문제가 되질 않는데
> 두개의 클리아언트가 동시에 작업을 할경우, 데이타가 끊긴다거나, 에러가 나기도 하고,
> 하나가 물고있으면 다른하나는 계속 대기하다가 timeout 이 걸리는 상황이 발생합니다.
>
> 아시는 계시문 조언좀 부탁드립니다...
>
> 참고로 저는 Tpowersocket 으로 클리아언트를 구성하였읍니다...
> 그리고 클라이언트 프로그램을 폼단위로 dll로 구성하고, 또 소켓모듈은 따로 dll로 만들어서 공통으로 사용하고 있는데.. 이것때문인지... 잘모르겠네요...?
>
>
> << 클라이언트 소켓모듈 >>
>
> ////////////////////////////////////////////////////////////////////////////////
> //// 소켓 초기화 함수 /////
> //// client : 파워소켓명 loc : directoy명 /////
> ////////////////////////////////////////////////////////////////////////////////
>
> function GF_SetClientSocket(Client : TPowerSock; loc : string) : boolean;
> var
> INI : TIniFile;
>
> begin
> result := True;
> try
> INI := TIniFile.Create(loc);
> Client.Host := INI.ReadString('value', 'address', '192.168.20.12');
> Client.Port := INI.ReadInteger('value', 'port', 6001); // GN_SOCPORT);
> Client.ReportLevel := 1;
> Client.Timeout := GN_SOCTIMEOUT;
> INI.Free;
>
> except
> result := false;
> client.Destroy;
> Client.Close(6001); //GN_SOCPORT);
> end;
>
> end;
>
> ////////////////////////////////////////////////////////////////////////////////
> //// 소켓 send /////
> //// client : 파워소켓명 /////
> //// msg : send message /////
> ////////////////////////////////////////////////////////////////////////////////
>
> function GF_SendClientSocket(var s_ReceiveStr: ansistring; var SENDHEAD_VAR: SENDHEAD_REC; msg : string): String;
> var
> s_Sendstr: String;
> s_rtnstr: String;
> s_Str1: String;
> i_Lenstr: integer;
> i_Maxnum: integer;
> i_nam: integer;
> ii: integer;
>
> soc : TPowersock;
> begin
> soc := TPowersock.Create(Application);
>
> s_ReceiveStr := '';
> result := '333';
>
> try
> sleep(20);
>
> if false = GF_SetClientSocket(soc,SOCKET_PATH) then Exit;
>
> ii := 0;
>
> while ( soc.Connected = false) do
> begin
> ii := ii + 1;
> soc.abort;
> soc.Connect;
> if ii = 99 then exit;
> end;
>
> soc.write(s_Sendstr);
>
> s_rtnstr := soc.Read(100);
> result:= Copy(s_rtnstr, 4, 3);
>
> SENDHEAD_VAR.SEND_DATE := Copy(s_rtnstr, 14, 8);
> s_Str1 := Copy(s_rtnstr, 97, 4);
> i_Lenstr := strtoInt(s_Str1);
> i_Maxnum := i_Lenstr div 256;
> i_nam := i_Lenstr mod 256;
>
> if i_Maxnum > 0 then
> begin
> for ii := 1 to i_Maxnum do
> begin
> s_ReceiveStr := s_ReceiveStr + soc.Read(256);
> end;
> end;
> if i_nam <> 0 then
> s_ReceiveStr := s_ReceiveStr + soc.Read(i_nam);
>
> Except
> begin
> if soc.Connected = True then
> soc.disConnect;
> //soc.Free;
> soc.Close(6001);
> soc.Destroy;
> Exit;
> end
> end;
>
> if soc.Connected = True then
> soc.disConnect;
> soc.Close(6001);
> soc.Destroy;
>
> end;
>