标签: indy

如何使用Indy 10和OpenSSL通过HTTPS下载文件?

我有以下任务:使用HTTPS和身份验证下载文件.Indy似乎要走了,但由于某种原因它到目前为止还不起作用.我有以下内容:

  • 我用来下载的TIdHTTP组件
  • 用于创建URL的TIdURI组件
  • 应该提供安全连接的TIdSSLIOHandlerSocketOpenSSL组件.所需的DLL位于二进制文件夹中.

该站点还需要身份验证,我在URL中包含用户/传递,如下例所示.简而言之,这是代码:

URI := TIdURI.Create('https://test.example.com/');
URI.Username := ParamUserName;
URI.Password := ParamPassword;

HTTP := TIdHTTP.Create(nil);
if URI.Protocol = 'https' then
begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IOHandler.SSLOptions.Method := sslvSSLv3;
  HTTP.IOHandler := IOHandler;
end;

HTTP.Get(URI.GetFullURI([ofAuthInfo]), FileStream);
Run Code Online (Sandbox Code Playgroud)

使用此代码,我可以非常快速地获得"读取超时"EIdReadTimeout异常.在浏览器中测试URL可以正常工作.关于什么缺失或我做错了什么的任何想法?

delphi openssl indy delphi-2006

9
推荐指数
1
解决办法
1万
查看次数

将流传递给CommandGet后,什么时候可以释放?

使用indy TIdHTTPServer,在OnCommandGet上,有可能将带有数据的流传递给AResponseInfo.ContentStream.这很好.我何时可以发布该流?假设服务器可以获得多个请求,并且可以在给定时间处理任何请求,并且一个流可以完成另一个流的任意.

流可以在哪里被释放?

代码示例:

var
  StreamsToFree : TList;

//assume StreamsToFree := TList.create; properly 

procedure TObject.IdHttpServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
stream : TFileStream;
begin
  stream := TFileSTream.create('file.name');
  AResponseInfo.ContentStream := stream;
  AResponseInfo.ResponseNo := 200;
  StreamsToFree.Add(generateReceiptXML);  
end;
Run Code Online (Sandbox Code Playgroud)

什么时候可以释放流?什么甚至,我们如何知道IdHttpServer,完成了它的转移?

delphi memory-management indy stream delphi-2009

9
推荐指数
1
解决办法
1229
查看次数

IdHTTP + SOCKS +袜子5

IdHTTP客户端组件与SOCKS5代理服务器结合使用时,我遇到了一般的Indy错误SSL.

  • 如果我使用IdHTTP我的SOCKS5代理组件(和非https URL),一切都可以正常工作.
  • 如果我使用IdHTTP带有SSL URL 的组件(并且没有SOCKS5代理),一切都可以正常运行.
  • 如果我使用IdHTTP带有SSL URL和SOCKS5代理的组件,我会收到以下错误:

Line 405 的错误输出 idSocks.pas (raise EIdSocksServerGeneralError.Create(RSSocksServerGeneralError);

这是我的代码

var
  HTTP            : TIdHTTP;
  Cookie          : TIdCookieManager;
  SSL             : TIdSSLIOHandlerSocketOpenSSL;
  Params          : TStringList;
  HTMLSource      : String;
  CurrentProxy    : String;
  ProxyPort       : Integer;
  ProxyHost       : String;
  ProxyUsername   : String;
  ProxyPW         : String;
begin
  Synchronize(AddItem);
  HTTP                          := TIdHTTP.Create(NIL);
  Cookie                        := TIdCookieManager.Create(HTTP);
  SSL                           := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
  HTTP.CookieManager            := Cookie;
  HTTP.IOHandler                := …
Run Code Online (Sandbox Code Playgroud)

delphi ssl proxy indy

9
推荐指数
1
解决办法
2629
查看次数

Indy写入缓冲/高效TCP通信

我知道,我问了很多问题......但是作为一个新的delphi开发人员,我一直在讨论所有这些问题:)

使用印10.为了使通信效率这一个与TCP通信交易,我编写一个客户端操作请求作为单个字节(在大多数情况下,接着,当然其他数据字节,但在这种情况下,只有一个单一的字节).问题是

var Bytes : TBytes;
...
SetLength (Bytes, 1);
Bytes [0] := OpCode;
FConnection.IOHandler.Write (Bytes, 1);
ErrorCode := Connection.IOHandler.ReadByte;
Run Code Online (Sandbox Code Playgroud)

不立即发送该字节(至少不调用服务器执行处理程序).如果我将'1'更改为'9',例如一切正常.我假设Indy缓冲了输出字节,并尝试禁用写缓冲

FConnection.IOHandler.WriteBufferClose;
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.如何发送单个字节并确保立即发送?并且 - 我在这里添加另一个小问题 - 使用indy发送整数的最佳方法是什么?不幸的是,我无法在TIdTCPServer的IOHandler中找到像WriteInteger这样的函数......而且

WriteLn (IntToStr (SomeIntVal))
Run Code Online (Sandbox Code Playgroud)

对我来说似乎不是很有效率.是否有所作为我是否使用多个写命令行或字节数组一起收拾东西,并发送一次?

谢谢你的回答!

编辑:我补充说,我使用的是印地10日以来似乎有关于读了重大变化,写程序的提示.

delphi performance tcp client-server indy

8
推荐指数
1
解决办法
1万
查看次数

Delphi:获取路由器的MAC

我正在使用Delphi,我想确定网络中网络设备的物理MAC地址,在本例中是路由器本身.

我的代码:

var
  idsnmp: tidsnmp;
  val:string;
begin
  idsnmp := tidsnmp.create;
  try
    idsnmp.QuickSend('.1.3.6.1.2.1.4.22.1.2', 'public', '10.0.0.1', val);
    showmessage(val);
  finally
    idsnmp.free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

其中10.0.0.1是我的路由器.

唉,QuickSend总是发送"由#10054连接重置".我试图修改MIB-OID,我也尝试了IP 127.0.0.1,哪个连接永远不会失败.我没有在Google上找到任何关于TIdSNMP的可用教程.:-(

关心Daniel Marschall

delphi networking snmp indy

8
推荐指数
2
解决办法
5045
查看次数

是否可以在Delphi XE和DataSnap中使用Indy 10.5.8.0?

案子

我正在尝试将INDY更新为我的Delphi XE(Update 1)的最新版本,所以我从indy.fulgan.com/ZIP下载了最新的INDY10文件(Indy_4545.zip).

这些包成功编译,现在我甚至可以在about box对话框中看到新版本10.5.8.0,但是在IDE重启之后我收到一条消息说:

No se encuentra el punto de entrada del procedimiento @ Idhttp @ TIdCustomHTTP @ GetRequestHeaders $ qqrv en la bibliotecadevínculosdinámicosIndyProtocols150.bpl.

我免费翻译成英文:

在动态链接库IndyProtocols150.bpl上找不到过程@ Idhttp @ TIdCustomHTTP @ GetRequestHeaders $ qqrv的入口点.

在对新旧IdHTTP.pas进行快速比较后,我发现TIdCustomHttp类有很多变化,包括重命名一些方法

  • GetResponseHeaders到GetResponse
  • GetRequestHeaders到GetRequest
  • SetRequestHeaders to SetRequest

与此更改以及其他和类接口中已更改的公共/已发布方法公司一起.

更新后,我得到了很多无法加载的软件包,包括dclcxPivotGridOLAPD15.bpl,它依赖于dclDataSnapServer150.bpl,它遇到了bpl上缺少的方法.

AFAIK我无法重新编译dclDataSnapServer150.bpl(也许还有其他失败的软件包,我刚刚停在这里).

IDE上的DataSnap和DevExpress支持对我来说是必须的

问题

  1. 是否有安全的预先建立的路径来更新到最新的Delphi XE INDY?
  2. 如果没有,我是否安全,只需通过创建旧的公共方法并在实现部分调用新的方法来填充源代码?
  3. 我错过了其他的东西,还是我真的坚持使用INDY 10.5.7直到下一个Delphi次要/主要版本?

delphi indy indy10 delphi-xe

8
推荐指数
3
解决办法
9011
查看次数

Delphi XE2 FireMonkey是否支持Indy用于跨平台应用程序?

用Firemonkey查看新的Delphi XE2.考虑到它为Windows,Mac OSX和iOS编译,VCL组件在FireMonkey应用程序中是无用的.

我的问题是:是否会有Indy Firemonkey版?因为我非常需要IdHTTP.Post();.如果没有,有没有办法在FireMonkey中执行此操作?

我现在谷歌搜索了很长一段时间,没有找到任何东西.:S

delphi http indy delphi-xe2 firemonkey

8
推荐指数
1
解决办法
4396
查看次数

对smtp.live.com和TIdSmtp(Indy,Delphi)的SSL支持

我正在尝试连接到smtp.live.com发送电子邮件(live.com支持自2009年以来的免费pop3/smtp,但这对我来说完全是新闻).

以下是当我尝试连接到smtp.live.com端口587时发生的情况:

Method sslvSSLv2  - timeout (obviously the server does not support SSL2)
Method sslvSSLv3  - Error connecting with SSL. - error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Method sslvSSLv23 - Error connecting with SSL. - error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Method sslvTLSv1  - Error connecting with SSL. - error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Run Code Online (Sandbox Code Playgroud)

我使用与sslvSSLv23和sslvTLSv1相同的代码,它与gmail smtp(smtp.gmail.com,端口465)服务器一起正常工作.此外,Outlook在检查SSL时正常发送邮件,在端口587上发送邮件,因此它可能与OpenSSL相关.任何人都可以帮我解开这个谜团吗?我错过了设置的东西吗?

delphi openssl smtp indy indy10

8
推荐指数
1
解决办法
5788
查看次数

Delphi + Indy导致高页面错误和RAM使用

我遇到一个奇怪的问题.

我使用Delphi和Indy上传和备份一些文件.它在许多计算机上运行得很好(Win7 64bit,WinXP).CPU使用率低于1%和最大值.RAM为20MB.

但是有一台计算机(Win 2008 R2)存在问题,我无法找到原因.CPU使用率为5-20%,内存需要100MB +,并且增加了很多.此外,"页面错误"上升很多,例如.每秒10万(我的电脑没有增加)

代码很简单

var
  IdHTTP: TIdHTTP;
  IdPostData: TIdMultiPartFormDataStream;
  sResponse: string;
begin
  IdHTTP := TIdHTTP.Create(nil);
  IdPostData:=TIdMultiPartFormDataStream.Create;

  try
    IdPostData.AddFile('file', 'C:\data.dat', '');

    sResponse:=IdHTTP.Post('http://web.com', IdPostData);

    ShowMessage(sResponse);
  finally
    IdHTTP.Free;
    IdPostData.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么"页面错误"增加了很多?是否有可能存在硬件问题?怎么找到它?

delphi indy page-fault

8
推荐指数
1
解决办法
546
查看次数

使用sslvSSLv23时如何确定协商了哪个TLS/SSL协议?

我正在使用TIdSSLIOHandlerSocketOpenSSL打开TLS/SSL连接.我目前想要支持1.0到1.2.

我像这样初始化IOHandler.

TIdSSLIOHandlerSocketOpenSSL(FSocket.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1];
Run Code Online (Sandbox Code Playgroud)

建立连接后,如何才能获得为连接协商的协议?(两者都用于确保客户端和测试服务器的配置是正确的,并最终用于统计目的).

SSLContext.Method在连接后检查过,但sslvSSLv23在连接后仍然显示.SSLContext.SSLVersions节目[sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1].

那么我如何获得这些信息呢?

delphi indy indy10

8
推荐指数
1
解决办法
822
查看次数