代码之家  ›  专栏  ›  技术社区  ›  Ferenc

Embarcadero Rad Studio Firemonkey Indy POP3 IPv6套接字错误11004

  •  1
  • Ferenc  · 技术社区  · 7 年前

    int port = 110;
    pop3->Host = ...
    pop3->Username = ...
    pop3->Password = ..
    pop3->AuthType = patUserPass;
    pop3->IOHandler = iOHandlerStack;
    iOHandlerStack->IPVersion = TIdIPVersion::Id_IPv6;
    pop3->UseTLS = utNoTLSSupport;
    pop3->Port = port;
    iOHandlerStack->Port = port;
    try
    {
        pop3->ConnectTimeout = 5000;
        pop3->Connect(); 
        int msgc = pop3->CheckMessages();
        pop3->Disconnect();
        ShowMessage("OK: " + IntToStr(msgc));
    }
    catch (Exception &exc)
    {
        ShowMessage(exc.Message);
    }
    

    如果我在IPv4网络中使用该应用程序,则在连接IPVersion后,该属性将自动设置为Id\u IPv4,并且没有问题。

    有趣的是,以下代码在IPv6网络中工作:

    IdTCPClient->IPVersion = TIdIPVersion::Id_IPv6;
    IdTCPClient->Host = ...
    IdTCPClient->Port = 80;
    IdTCPClient->Connect();
    IdTCPClient->Disconnect();
    ShowMessage("OK");
    

    有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Remy Lebeau    7 年前

    您需要设置 pop3->IPVersion 属性(继承自 TIdTCPClient iOHandlerStack->IPVersion 直接的财产。

    Connect() IPVersion 较高层的特性值 TIdTCPClient::IPVersion

    那么,如果你要离开 默认值为 Id_IPv4 ,这就解释了为什么无法使用IPv6进行连接。为什么你的 示例有效。

    此外,您不需要设置 iOHandlerStack->Port Connect() 也能解决这个问题。