使用 IdHTTPProxyServer1

working with IdHTTPProxyServer1

我想用 TIdHTTPProxyServer 编写一个简单的代理,这是我的代码:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    IdHTTPProxyServer1->DefaultPort = 8090;
    IdHTTPProxyServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    int Index = 0;
    TList * cList;
    {
        cList = IdHTTPProxyServer1->Contexts->LockList();
        try
        {
            for ( int stop = cList->Count - 1, Index = 0; Index <= stop; Index++)
            {
                TIdContext * t;
                t = static_cast <TIdContext*>(cList[Index]);
                t->Connection->Disconnect();
            }
        }
        __finally
        {
            IdHTTPProxyServer1->Contexts->UnlockList();
        }
        IdHTTPProxyServer1->Active = false;
    }
}

我有两个问题:

  1. 如何将 TList 转换为 TIdContext?

  2. 此代码不会更改我的 IP,我想更改我的 IP。如何使用 TIdHTTPProxyServer 更改我的 IP?

How can I cast a TList to a TIdContext?

你不知道,因为它们没有关系 类。真正的问题是您一开始就没有正确访问 TList 项。您需要直接使用 TList::Items[] 属性:

t = static_cast<TIdContext*>(cList->Items[Index]);

或者间接地,通过取消引用 TList 指针,以便可以调用 TList::operator[](在内部使用 Items[] 属性):

t = static_cast<TIdContext*>((*cList)[Index]);

无论如何,这段代码是完全没有必要的,因为 Indy 会在服务器 deactivated/destroyed:

时自动为您关闭所有活动的客户端
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    IdHTTPProxyServer1->Active = false;
}

This code doesn't change my IP and I want to change my IP. How can I change my IP with TIdHTTPProxyServer ?

您不能使用 TIdHTTPProxyServer 更改本地机器的 IP,那不是它的本意。事实上,在 Indy 中没有任何东西可以改变本地机器的 IP,那是在 Indy 的范围之外。您必须为此使用特定于平台的 API。你到底想完成什么?请 post 关于此主题的单独问题,并解释您对此的要求。