代码之家  ›  专栏  ›  技术社区  ›  M Schenkel

获取indy错误“无法绑定套接字。地址和端口已在使用中“

  •  2
  • M Schenkel  · 技术社区  · 15 年前

    我开发了一个DelphiWeb服务器应用程序(twebmodule)。它在Windows下的Apache上作为isapi dll运行。反过来,应用程序使用indy-tidthttp组件频繁地对其他网站进行https调用。使用tidtp.get方法时,我会定期收到此错误:

    无法绑定套接字。地址和端口已在使用中

    代码如下:

      IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
      IdHTTP := TIdHTTP.create(nil);
    
    
      idhttp.handleredirects := True;
      idhttp.OnRedirect := DoRedirect;
      with IdSSLIOHandlerSocket1 do begin
        SSLOptions.Method := sslvSSLv3;
        SSLOptions.Mode :=  sslmUnassigned;
        SSLOptions.VerifyMode := [];
        SSLOptions.VerifyDepth := 2;
      end;
      with IdHTTP do begin
        IOHandler := IdSSLIOHandlerSocket1;
        ProxyParams.BasicAuthentication := False;
        Request.UserAgent := 'Test Google Analytics Interface';
        Request.ContentType := 'text/html';
        request.connection := 'keep-alive';
        Request.Accept := 'text/html, */*';
      end;
      try
        idhttp.get('http://www.mysite.com......');
      except
        .......
      end;
      IdHTTP.free;
      IdSSLIOHandlerSocket1.free;
    

    我读过关于 重新使用磁带 方法,可以在tidthttp和tidssliohandlersocketopenssl对象上设置。设置为rstrue会解决我的问题吗?我问是因为我无法复制这个错误,它只是周期性地发生。

    其他注意事项:

    • 我知道twebmodule的多个实例正在生成。
    • 将对tidtp.get的所有调用包装在tcriticalsection中是否可以解决该问题?

    更新: 在网上做了更多的搜索之后,我发现了: link text

    当我做 NETSTAT-N 我也得到了一堆状态为“关闭等待”的条目。

    2 回复  |  直到 12 年前
        1
  •  3
  •   M Schenkel    15 年前

    我终于明白了。结果发现我没有释放tidtp对象。在我的原型示例中,它显示了这一点。但我的实际源代码使用对象,并且释放IDHTTP对象的代码包含在未正确标记为override的析构函数中。所以没人打过电话。

        2
  •  1
  •   Marco van de Voort    15 年前

    尝试分配一个高端口号。连接低(0..1023)端口需要管理权限IIRC。

    算了吧,我的错。TidHTTP是客户机,而不是服务器。

    是的,听起来多个线程试图使用相同的tidthttp。

    一个特殊的部分可以工作,但是可以有效地序列化结果。如果这是一个问题,请使用一个TidHTTP客户机池。