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;