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 + -
显示快捷键?