mainform.cpp
来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 499 行 · 第 1/2 页
CPP
499 行
{
if (ElLocalPortForwardSSHTunnel->Connections[i]->Data == Socket)
{
try
{
Log((AnsiString)"Client connection closed, removing socket [" + IntToHex(int(Socket), 8) + "] from list");
RemoveConnectionFromList(ElLocalPortForwardSSHTunnel->Connections[i]);
}
catch(Exception &e)
{
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int I = SocketList->IndexOf(Socket);
if (I < 0)
{
Log("Warning: Received data from unexpected socket object");
return;
}
char* Buf = new char[16384];
int Size = Socket->ReceiveBuf(Buf, 16384);
if (Size > 0)
{
char* Buf1 = new char[Size+1];
memcpy(Buf1, Buf, Size);
Buf1[Size] = 0;
if (I >= ConnList->Count)
BufferList->Strings[I] = BufferList->Strings[I] + Buf1;
else
{
((TElSSHTunnelConnection*)(ConnList->Items[I]))->SendData(Buf1, Size);
PForwardStatus(StatusList->Items[I])->Sent += Size;
}
delete[] Buf1;
}
delete[] Buf;
RefreshListView();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TunnelConnectionData(TObject* Sender, void* Buffer, int Size)
{
Log(IntToStr(Size) + " bytes received from logical connection [" + IntToHex(int(Sender), 8) + "]");
int I = ConnList->IndexOf(Sender);
if (I < 0)
return;
PForwardStatus(StatusList->Items[I])->Received += Size;
char* Ptr = (char*)Buffer;
while (Size > 0)
{
int Sent = ((TCustomWinSocket*)(SocketList->Items[I]))->SendBuf(Ptr, Size);
if (Sent > 0)
{
Ptr += Sent;
Size += Sent;
}
else
Sleep(0);
}
RefreshListView();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TunnelConnectionError(TObject* Sender, int ErrorCode)
{
// connection error should be handled here
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TunnelConnectionClose(TObject* Sender, TSSHCloseType CloseType)
{
Log((AnsiString)"Tunnel connection [" + IntToHex(int(Sender), 8) + "] was closed");
int I = ConnList->IndexOf(Sender);
if (I >= 0)
PForwardStatus(StatusList->Items[I])->SocketState = STATE_DISCONNECTED;
RemoveConnectionFromList((TElSSHTunnelConnection*)(Sender));
RefreshListView();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnStartClick(TObject *Sender)
{
if (!ConnActive)
{
try
{
Log("Opening listening socket");
ServerSocket->Port = StrToInt(edtLocalServerPort->Text);
ServerSocket->Open();
if (SSHClientSocket->Active)
SSHClientSocket->Close();
SSHClientSocket->Host = edtSSHHost->Text;
SSHClientSocket->Port = StrToInt(edtSSHPort->Text);
ElSSHClient->UserName = edtSSHUsername->Text;
ElSSHClient->Password = edtSSHPassword->Text;
ElLocalPortForwardSSHTunnel->Port = StrToInt(edtLocalServerPort->Text);
ElLocalPortForwardSSHTunnel->ToHost = edtRemoteHost->Text;
ElLocalPortForwardSSHTunnel->ToPort = StrToInt(edtRemotePort->Text);
lvEvents->Items->Clear();
Log((AnsiString)"Connecting to host " + edtSSHHost->Text);
SSHClientSocket->Open();
btnStart->Caption = "Stop";
ConnActive = true;
}
catch(Exception &e)
{
btnStart->Caption = "Start";
ConnActive = false;
}
}
else
{
if (ElSSHClient->Active)
ElSSHClient->Close(true);
if (ServerSocket->Active)
ServerSocket->Close();
btnStart->Caption = "Start";
ConnActive = false;
}
}
//---------------------------------------------------------------------------
void TfrmMain::RefreshListView(void)
{
lvConnections->Items->BeginUpdate();
lvConnections->Items->Clear();
for (int I = 0; I<StatusList->Count; I++)
{
PForwardStatus P = PForwardStatus(StatusList->Items[I]);
TListItem* Item = lvConnections->Items->Add();
Item->Caption = "";
Item->SubItems->Add(((TServerClientWinSocket*)(SocketList->Items[I]))->RemoteHost + ":" +
IntToStr(((TServerClientWinSocket*)(SocketList->Items[I]))->RemotePort));
Item->SubItems->Add(IntToStr(P->Sent));
Item->SubItems->Add(IntToStr(P->Received));
AnsiString S;
switch(P->SocketState)
{
case STATE_NOT_CONNECTED:
Item->ImageIndex = 2;
S = "Not connected";
break;
case STATE_ESTABLISHING_FORWARDING:
Item->ImageIndex = 1;
S = "Establishing";
break;
case STATE_ACTIVE:
Item->ImageIndex = 0;
S = "Active";
break;
case STATE_DISCONNECTED:
Item->ImageIndex = 2;
S = "Disconnected";
break;
}
Item->SubItems->Add(S);
}
lvConnections->Items->EndUpdate();
}
//---------------------------------------------------------------------------
void TfrmMain::ClearConnections(void)
{
for (int i=0; ElLocalPortForwardSSHTunnel->ConnectionCount; i++)
RemoveConnectionFromList(ElLocalPortForwardSSHTunnel->Connections[i]);
ConnList->Clear();
SocketList->Clear();
BufferList->Clear();
for (int i = 0; i<StatusList->Count; i++)
delete[] PForwardStatus(StatusList->Items[i]);
StatusList->Clear();
}
//---------------------------------------------------------------------------
//----------------------- Helper classes ----------------------
/* TTunnelInfoList */
void TTunnelInfoList::AddTunnel(TTunnelInfo* AObject)
{
TStringList::AddObject("",AObject);
}
//---------------------------------------------------------------------------
TTunnelInfo* TTunnelInfoList::GetInfo(int Index)
{
try
{
return ((TTunnelInfo*)(Objects[Index]));
}
catch(Exception &e)
{
return NULL;
}
}
//---------------------------------------------------------------------------
void TTunnelInfoList::PutInfo(int Index, const TTunnelInfo* Value)
{
while (Count <= Index)
Add("");
Objects[Index] = (TObject*)Value;
}
//---------------------------------------------------------------------------
int TTunnelInfoList::IndexByTunnel(TElSSHTunnelConnection* Tunnel)
{
for (int i=0;i<Count; i++)
{
TTunnelInfo* TI = Info[i];
if (TI->Tunnel == Tunnel)
return i;
}
return -1;
}
//---------------------------------------------------------------------------
int TTunnelInfoList::IndexBySocket(TCustomWinSocket* Socket)
{
for (int i=0; i<Count; i++)
{
TTunnelInfo* TI = GetInfo(i);
if (TI == NULL)
if (TI->Socket == Socket)
return i;
}
return -1;
}
//---------------------------------------------------------------------------
void TTunnelInfoList::AddBySocket(TCustomWinSocket* ASocket)
{
TTunnelInfo* TI = new TTunnelInfo;
TI->Socket = ASocket;
AddTunnel(TI);
}
//---------------------------------------------------------------------------
void TTunnelInfoList::AddTunnelForSocket(TCustomWinSocket* ASocket, TElSSHTunnelConnection* ATunnel)
{
TTunnelInfo* TI = GetInfo(IndexBySocket(ASocket));
if ( TI != NULL)
return;
TI = new TTunnelInfo;
TI->Socket = ASocket;
AddTunnel(TI);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?