Q&A

  • Socket 관련 문의드립니다.
Delphi 4.0 Professional 버젼에서 제공하는 TServerSocket 및 TClientSocket을 사용하여 프로그램을 짯습니다.



이것으로 하니 처음 Server와 Client간의 접송은 잘되었습니다.



그런데 문제는 연결이 되다가 Server를 죽였을 때 다시 Server를 살리면서 입니다.



Client와 Server가 통신중 만일 Server가 죽으면 Client는 0.5초마다 ClientSocket.Active를 True로 하여 Connection을 시도하도록

시켰고, 만일 Client가 죽으면 Server는 Listening 상태로 되돌아 가도록 했습니다.



그러나, Server를 의도적으로 죽이고, 다시 Server를 살렸을 때 Server는 계속 Listen 상태로 있고, Client는 계속 Connection하는데,

둘 사이는 연결은 되지 않는 현상이 일어납니다.



제가 생각하기에는 처음에 Client와 Server가 통신중에 있던 정보들이 Server를 죽였을 때 그 Socket에 남아있어서 Client의 0.5초마다 하는 Connection시에도

계속 그 정보가 남아있어서 서로 쫑이 나는 것이 아닌가 생각합니다.



여러 전문가들께서 관심을 가지시고 해결해 주셨으면 합니다.



참고로 Source Code를 첨부에 띄웁니다.



1) Server쪽 프로그램.

procedure TChatForm.FileListenItemClick(Sender: TObject);

begin

FileListenItem.Checked := not FileListenItem.Checked;

if FileListenItem.Checked then

begin

// ServerSocket.Port := SERVER_PORT;

ServerSocket.Active := True;

// Statusbar1.Panels[0].Text := 'Listening...';

ComboBox1.Visible := true;

Label2.Visible := true;

end

else

begin

if ServerSocket.Active then ServerSocket.Active := False;

Statusbar1.Panels[0].Text := 'Not Listening Status';

ComboBox1.Visible := false;

Label2.Visible := false;

end;



{ ServerSocket.Port := SERVER_PORT;

ServerSocket.Active := True;

// Statusbar1.Panels[0].Text := 'Listening...';

ComboBox1.Visible := true;

Label2.Visible := true;

}

end;



procedure TChatForm.Exit1Click(Sender: TObject);

begin

ServerSocket.Close;

// ServerSocket.Free;

Close;

end;



procedure TChatForm.FormCreate(Sender: TObject);

begin

// FileListenItemClick(nil);

// _InCrease := 0;

end;



procedure TChatForm.ServerSocketClientRead(Sender: TObject;

Socket: TCustomWinSocket);

begin

Memo2.Lines.Add(Socket.ReceiveText);

end;



procedure TChatForm.ServerSocketClientConnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Memo2.Lines.Clear;

Statusbar1.Panels[0].Text := 'Connected to: ' + Socket.RemoteAddress;

end;



procedure TChatForm.ServerSocketClientDisconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

// ServerSocket.Active := false;

Statusbar1.Panels[0].Text := 'Listening...';

FileListenItem.Checked := not FileListenItem.Checked;

FileListenItemClick(nil);

end;



procedure TChatForm.ServerSocketClientError(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

Statusbar1.Panels[0].Text := '완전히 에러 났구만!!';

ErrorCode :=0;

// Socket.Close;

end;



procedure TChatForm.ComboBox1Change(Sender: TObject);

var

Buf, Count : Integer;

begin

Buf := ComboBox1.ItemIndex;

Count := sizeof(Buf);

ServerSocket.Socket.Connections[0].SendBuf(Buf,Count);

end;



procedure TChatForm.ServerSocketListen(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text := 'In Listening....';

end;





2) Client쪽



procedure TChatForm.FileConnectItemClick(Sender: TObject);

begin



if ClientSocket.Active then ClientSocket.Active := false;



with ClientSocket do

begin

Address := SERVER_ADDRESS;

// Port := SERVER_PORT;

Active := True;

// Open;

end;



Panel2.Visible := true;

_InCrease := 1;



end;



procedure TChatForm.ClientSocketConnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text := 'Connected to: ' + Socket.RemoteHost;

Memo2.Clear;

Timer1.Enabled:= false;

SpeedButton1.Visible := false;

end;



procedure TChatForm.ClientSocketRead(Sender: TObject;

Socket: TCustomWinSocket);

var

Buf, Count, i : Integer;

ImsiByte : Byte;

begin

Count := sizeof(Buf);

socket.ReceiveBuf(Buf, Count);



{ImsiByte := byte(Buf);

for i:=0 to 7 do

begin

if (ImsiByte and 1) = 1 then

TPanel(FindComponent('Panel' + IntToStr(i+2))).Color := clBlack

else

TPanel(FindComponent('Panel' + IntToStr(i+2))).Color := clWhite;

ImsiByte := (ImsiByte shr 1);

end;}

case Buf of

0 : Panel2.Color := clBlack;

1 : Panel2.Color := clMaroon;

2 : Panel2.Color := clGreen;

3 : Panel2.Color := clOlive;

4 : Panel2.Color := clNavy;

5 : Panel2.Color := clPurple;

6 : Panel2.Color := clTeal;

7 : Panel2.Color := clGray;

end;



end;



procedure TChatForm.ClientSocketDisconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text := '서버와의 연결이 끊어짐.';



// if ClientSocket.Active then ClientSocket.Active := false;

Memo2.Lines.Add('서버와의 연결이 끊어짐.');



Timer1.Enabled:= true;

end;



procedure TChatForm.ClientSocketError(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

Memo2.Lines.Add('Error connecting to : ' + SERVER_ADDRESS);

ErrorCode := 0;



Socket.Close;



// if ClientSocket.Active then ClientSocket.Active := false;

Memo2.Lines.Add('Error # ==' + IntToStr(_InCrease));

inc(_InCrease);

end;



procedure TChatForm.Timer1Timer(Sender: TObject);

begin



ClientSocket.Address := SERVER_ADDRESS;

ClientSocket.Port := SERVER_PORT;



try

ClientSocket.Active := True;

except

end;



Memo2.Lines.Add('Error # ==' + IntToStr(_InCrease));

inc(_InCrease);

end;



procedure TChatForm.ClientSocketLookup(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text := 'Lookup중임....';

end;



procedure TChatForm.ClientSocketConnecting(Sender: TObject;

Socket: TCustomWinSocket);

begin

Statusbar1.Panels[0].Text := 'Connecting중임....';

end;



procedure TChatForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

ClientSocket.Free;

end;



0  COMMENTS