如何在Delphi中获取Indy HTTP Server以在iOS应用程序中接收连接?

时间:2013-05-01 23:59:05

标签: ios delphi indy10 httpserver delphi-xe4

我正在编写一个多平台应用程序,它是一种“代理”,旨在表示HTTP请求并将其中一些传递给远程服务器并直接响应其他人。因此它既充当HTTP客户端又充当HTTP服务器。

我一直在Delphi和Lazarus中使用Indy 10组件,它们在桌面平台上运行良好。我已经使用Lazarus将项目成功移植到Windows,Linux和MacOS。现在我尝试使用Delphi XE4对iOS进行相同的操作。我目前在运行OSX 10.8.2的Mac上的iOS模拟器中运行该项目;稍后我将针对iPad设备。

但我发现我无法让TIdHTTPServer组件在iOS上创建与传入请求的连接。我将服务器绑定到IP地址和端口并激活它;这启动了侦听器线程。但是当我尝试向服务器发送GET请求时,它会引发异常EIdIPVersionUnsupported,并显示消息“不支持所请求的IPVersion / Address系列”。无论我是尝试从应用程序本身路由GET请求,还是从另一台机器上运行的浏览器外部路由,都会发生此错误。

我通常将HTTP服务器绑定到本地主机IP地址,因为代理程序旨在作为后台进程运行,从而在前台运行的浏览器中处理请求。对于外部浏览器测试,我将其绑定到Mac自己的IP地址。

1 个答案:

答案 0 :(得分:3)

大多数Indy组件(包括TIdHTTPServer)在iOS中的工作方式与在其他平台上完全相同。在Indy中唯一改变以支持iOS的是实现低级套接字API函数调用(通过TIdStackVCLPosix类),并更新Indy的内部编码以支持新的Embarcadero移动编译器(ARC等)。 / p>

TIdHTTPServer应该可以在iOS上运行,只要它有权打开TCP / IP侦听套接字。 EIdIPVersionUnsupported异常表示使用TIdStackVCLPosix不支持该特定API调用的IP版本尝试进行低级套接字API调用。所有TIdStackVCLPosix方法都支持IPv4和IPv6。因此,在没有看到导致异常的实际堆栈跟踪的情况下,我只能猜测可能Posix的accept()函数报告连接的客户端使用的是IPv4或IPv6以外的套接字地址类型。

话虽如此,我确实修复了TIdStackVCLPosix.Accept()中的一个小错误,它在调用POSIX的accept()函数之前没有初始化其地址存储的大小,所以这可能是也可能不是贡献因子。获取最新的Indy 10 SVN版本(其他错误修复程序未进入XE4版本)并重试。