【问题标题】:Delphi XE3 with Indy 10 error when run in IDE or debug version, not release versionDelphi XE3 在 IDE 或调试版本中运行时出现 Indy 10 错误,而不是发布版本
【发布时间】:2013-01-04 14:22:51
【问题描述】:

在运行代码以连接到 TLama 提供的 Gmail 时 How to login to a Gmail account and get number of messages in a mailbox with TIdIMAP4? 它在 Delphi 5 和 Delphi 2007 中运行得非常好。

我在 Delphi XE3 上尝试了相同的代码,但奇怪的是,当我在 IDE 中或直接从文件资源管理器启动在 \win32\debug 目录中生成的 exe 时,我得到了“套接字错误 #10061 连接被拒绝”错误。如果我启动在 \Win32\release 目录中生成的 .exe,它可以正常工作!

我尝试将 ssleay32.dll 和 libeay32.dll 放在各种目录中,但它仍然不起作用,我不确定它是否与此有关。

Delphi XE3 上的 Indy 版本为 10.5.9.0。 (最初随我的 Delphi XE3 Update 1 提供)。

非常感谢任何帮助!

【问题讨论】:

    标签: delphi indy10 delphi-xe3


    【解决方案1】:

    套接字错误 10061 表示以下两种情况之一:

    1. 您尝试连接到一个根本不监听连接的 IP/端口。

    2. 您尝试连接到正在侦听连接的 IP/端口,但在该特定时刻没有任何可用插槽来接受新的客户端连接。

    在客户端无法区分这两种可能性。

    在 Debug 与 Release 版本中,Indy 如何管理其套接字应该没有区别。您看到的问题与 DLL 无关,因为在首先建立底层套接字连接之后才会调用它们(但是,您可以在 IdSSLOpenSSLHeaders 单元中使用 Indy 的 IdOpenSSLSetLibPath() 函数来告诉 Indy DLL 在哪里位于,如果需要)。

    在调用Connect() 时仔细检查Port 属性。设置UseTLS 属性实际上可以改变Port 的值。如果您需要设置这两个属性,请先设置UseTLS,然后设置Port,如果您需要使用与 Indy 分配的值不同的值。

    【讨论】:

    • 我尝试在 UseTLS 之后修改端口,但仍然是同样的错误。如果我在以调试模式连接之前检查端口,我正确地有 993。
    • 可以肯定的是,我尝试使用 IdOpenSSLSetLibPath() 来明确提及 DLL,但正如您所料,它仍然无法正常工作。这很奇怪。我尝试在 win32\release\ 目录中启动 .exe,并且此版本有效。
    • 由于调试版本失败,当您在 IDE 中时,您是否尝试过单步执行 Indy 源代码以确保一切设置正确?使用最新的 Indy 10 SVN 快照,在调试模式下运行时连接到 Gmail IMAP 没有问题。所以它必须在你的设置中。
    • 我安装了 Indy 10.5.9.4885 但仍然有同样的问题。我通过并在 TIdSocketHandle.Connect 中使用参数(416,173.194.78.108、993、Id_IPv4)调用 GStack.Connect(Handle, PeerIP, PeerPort, FIPVersion)。在 IdWinsock2 中调用 Stub_connect 时出错,结果为 -1。
    • 这意味着 Indy 工作正常。您的操作系统根本无法连接到 173.194.78.108:993,仅此而已。就像我说的,它对我来说很好,但是我的电脑将 imap.gmail.com 解析为 173.194.79.108,所以要么你的电脑的 DNS 配置不正确,要么你的网络上的某些东西阻止了连接,或者 Gmail 更有可能是负载平衡等,173.194.78.108 在 Gmail 端无法正常工作,但 173.194.79.108 可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多