TServerSocket이 ThreadBlocking모드일때 그에 해당하는 도움말중
Thread의 실제 수행부분의 내용이 아래와 같더군요!
procedure TMyServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0);
if Stream.WaitForData(60000) then
begin
if Stream.Read(Buffer, 10) = 0 then <----비정상처리부분
ClientSocket.Close;
...
end
else
ClientSocket.Close; { if client doesn뭪 start, close }
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;
비정상적으로 클라이언트의 연결이 끊어졌을때
if Stream.Read( , ) = 0 then 이 부분이 조건을
만족하여 ClientSocket를 닫더군요. 여기까지는
이해가 갔습니다만,,,제가 구현한 부분을 보면,,
procedure TMyServerThread.ClientExecute;
var
RcvSize : Integer;
RcvPacket, Command: String;
begin
try
while (not Terminated) and ClientSocket.Connected do
begin
RcvPacket := ClientSocket.ReceiveText;
Command := GetCommand(RcvPacket , 1);
if Command = LOGIN then ... 로그인루틴
else if Command = MAKE_ROOM then ...방만들기루틴
else if Command = LOGOUT then ..로그아웃루틴
begin
ClientSocket.Close;
Break;
end;
end;
....
"LOGOUT" 루틴에 걸리면 ClientSocket를 Close를 하므로 while루틴을 빠져
나옵니다.
그런데 클라이언트가 비 정상종료를 했을때는 계속 ClientSocket.Connected
의 값이 True 더군요! 비정상종료되면 소켓을 닫아야 하는데 계속 while문의
무한루프에 빠집니다. 이 경우엔 어떻게 해야하나요?