GUI에서 '닫기'버튼을 누르면 Indy/Lazarus로 TIdTCPServer를 올바르게 닫는 방법? 도와 줘서 고맙다! (원래 질문 변경)Indy/lazarus TIdTCPServer 제대로 닫는 방법
클라이언트가 연결을 끊으면 TIdTCPServer를 닫는 방법?
예외가 처리해야합니까?
IO는 작동하지만 조금 불안정합니다. 다음 코드는 다음과 같습니다.
unit pt_socket;
{$mode objfpc}//{$H+}
interface
uses
Classes, SysUtils,
Forms,
IdGlobal,
IdContext, IdComponent,
IdTCPServer, IdTCPClient,
Controls, Graphics, Dialogs;
type
TSocket = class
private
IdTcpServer1: TIdTCPServer;
IdTcpClient1: TIdTCPClient;
procedure IdTCPServer1Connect(AContext: TIdContext);
procedure IdTCPServer1Disconnect(AContext: TIdContext);
//procedure IdTCPServer1Exception(AContext: TIdContext; AException: Exception);
procedure IdTCPServer1Execute(AContext: TIdContext);
public
procedure init;
function Open: boolean;
procedure Close;
function Write(str: TByteArray; len: integer): integer;
end;
var
lst: Tlist;
implementation
uses main, pt_settings, pt_ctlpanel, pt_terminal;
procedure TSocket.init;
begin
end;
procedure TSocket.IdTCPServer1Connect(AContext: TIdContext);
begin
MainApp.GuiPortOpen;
lst := IdTcpServer1.Contexts.LockList;
end;
procedure TSocket.IdTCPServer1Disconnect(AContext: TIdContext);
begin
IdTcpServer1.Contexts.UnlockList;
MainApp.GuiPortClose;
end;
//procedure TSocket.IdTCPServer1Exception(AContext: TIdContext; AException: Exception);
//begin
// MainApp.GuiPortClose;
//end;
procedure TSocket.IdTCPServer1Execute(AContext: TIdContext);
var
Socket_Receive_Buffer: TIdBytes;
Socket_Input_Length: integer;
Input_Buffer: TByteArray;
begin
with AContext.Connection do
begin
IOHandler.ReadBytes(Socket_Receive_Buffer, -1, false);
Socket_Input_Length := Length(Socket_Receive_Buffer);
if Socket_Input_Length > 0 then
begin
BytesToRaw(Socket_Receive_Buffer,Input_Buffer,Socket_Input_Length);
Terminal.GuiTerminalPutInput(Input_Buffer, Socket_Input_Length);
end;
end;
end;
function TSocket.Open: boolean;
begin
if Settings.SocketModeRadioGroup.ItemIndex = 0 then
begin
IdTcpServer1 := TIdTCPServer.Create(nil);
IdTCPServer1.OnExecute := @IdTCPServer1Execute;
IdTCPServer1.OnConnect := @IdTCPServer1Connect;
IdTCPServer1.OnDisconnect := @IdTCPServer1Disconnect;
//IdTcpServer1.OnException := @IdTCPServer1Exception;
IdTcpServer1.DefaultPort := StrToInt(Settings.SocketPortEdit.Text);
IdTcpServer1.MaxConnections := 1;
IdTCPServer1.Bindings.Add.IPVersion := Id_IPv4;
IdTcpServer1.Active := True;
end
else
begin
IdTcpClient1 := TIdTCPClient.Create(nil);
//IdTcpClient1.DefaultPort := StrToInt(Settings.SocketPortEdit.SelText);
end;
end;
procedure TSocket.Close;
begin
if Settings.SocketModeRadioGroup.ItemIndex = 0 then
begin
IdTcpServer1.Destroy;
end
else
begin
IdTcpClient1.Destroy;
end;
end;
function TSocket.Write(str: TByteArray; len: integer): integer;
var
Socket_Transmit_Buffer: TIdBytes;
begin
Socket_Transmit_Buffer := RawToBytes(str,len);
if len > 0 then
// Only one connection by design
with TIdContext(lst.Items[0]).Connection do
begin
IOHandler.Write(Socket_Transmit_Buffer);
end;
Result := len;
end;
end.