클라이언트 측에는 TCLIENTSOCKET을 사용하고
서버측에는 TSERVERSOCKET을 사용하는 메신저 프로그램에서
만약 여러 클라이언트가 서버에 접속된 상태에서 한명의 클라이언트의 시스템이 갑자기
정전되면은 서버프로그램에서 다음과 같은 ERROR MESSAGE를 뿌리며 다운되어서
나머지 클라이언트들도 사용할 수 없게 됩니다.
(ESOCKETERROR CODE=10053)
여기서 클라이언트소켓중 하나가 오류가 발생하더라도 나머지 클라이언트들은 정상적으로
사용할 수 있도록 서버가 다운되지 않게 하려면 어떻게 해야하나요 ?
혹시 오류난 클라이언트만 서버측에서 CONNECTION을 삭제할 수는 없는 지요 ?
도와주셔요 !
> 클라이언트 측에는 TCLIENTSOCKET을 사용하고
> 서버측에는 TSERVERSOCKET을 사용하는 메신저 프로그램에서
> 만약 여러 클라이언트가 서버에 접속된 상태에서 한명의 클라이언트의 시스템이 갑자기
> 정전되면은 서버프로그램에서 다음과 같은 ERROR MESSAGE를 뿌리며 다운되어서
> 나머지 클라이언트들도 사용할 수 없게 됩니다.
> (ESOCKETERROR CODE=10053)
>
> 여기서 클라이언트소켓중 하나가 오류가 발생하더라도 나머지 클라이언트들은 정상적으로
> 사용할 수 있도록 서버가 다운되지 않게 하려면 어떻게 해야하나요 ?
> 혹시 오류난 클라이언트만 서버측에서 CONNECTION을 삭제할 수는 없는 지요 ?
>
> 도와주셔요 !
안녕하세요. 송재영입니다.
음. 위에서 에러가 난는건 클라이언트 Socket 에러시 서버쪽에 별도의 코딩이 되어
있지 않은거 같내여.
음.. 그래서 해결방법은 아래의 소스처럼 하시면 될겁니다.
아래의 코드는 제가 예전에 만들었던 소스중에 일부를 발취했습니다.
서버 소켓의 OnClientError 이벤트에서 작업하시면 됩니다.
begin
i := 0;
rmtAddr := Socket.RemoteAddress;
while Length(rmtAddr) <> 15 do
rmtAddr := rmtAddr + ' ';
SocKet.Close;
try
while true do
begin
if rmtAddr = Copy(ListBox1.Items[i], 1, 15) then
begin
rmtName := Copy(ListBox1.Items[i], 19, 10);
ListBox1.Items.Delete(i);
Break;
end;
inc(i);
end;
except
end;
RcvData.Msg := '님이 예상치 못한 종료를 하였습니다.';
i := 0;
while ListBox1.Items.Count <> i do
begin
try
Server.Socket.Connections[i].SendText('3' + RcvData.RcvDate +
rmtName +
RcvData.Msg);
inc(i);
except
Exit;
end;
end;
end;
보시면 아시겠지만 제가 만든 서버에는 리스트박스에 현재 접속되어 있는 사용자들의
아이디와 IP를 보여주고 있거든요.
그래서 만약 클라이언트중에 누군가 에러가 나면 현재 접속되어 있는 사용자 리스트에서
바로 제거를 하고 다른 클라이언트들에게 누가 비정상 종료를 했다는 메세지를 보내줍니다.
그럼 이만.. ^^;