Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如果函数中的局部变量大于4K,eds将生成代码来触摸页面,因为扩展由页面错误控制,但仅针对堆栈中最低的(保护)页面)。这意味着您将在处理连接的最大2000个并发线程之后耗尽地址空间_Delphi_Winapi_Sockets_Asynchronous_Networking - Fatal编程技术网

Delphi 如果函数中的局部变量大于4K,eds将生成代码来触摸页面,因为扩展由页面错误控制,但仅针对堆栈中最低的(保护)页面)。这意味着您将在处理连接的最大2000个并发线程之后耗尽地址空间

Delphi 如果函数中的局部变量大于4K,eds将生成代码来触摸页面,因为扩展由页面错误控制,但仅针对堆栈中最低的(保护)页面)。这意味着您将在处理连接的最大2000个并发线程之后耗尽地址空间,delphi,winapi,sockets,asynchronous,networking,Delphi,Winapi,Sockets,Asynchronous,Networking,现在,您可以使用{$M minStackSize[,maxStackSize]}指令更改PE中的默认堆栈大小,但这将影响所有线程,包括主线程。我希望您不要做太多的递归,因为48K或(类似)并没有太多的空间 现在,Paul关于异步I/O在Windows上的非性能是否正确,尤其是,我不能100%确定——我必须对其进行测量才能确定。然而,我所知道的是,关于线程编程比基于异步事件的编程更容易的论点正呈现出一种错误的二分法 异步代码不需要基于事件;它可以是基于continuation的,就像在.NET中一

现在,您可以使用{$M minStackSize[,maxStackSize]}指令更改PE中的默认堆栈大小,但这将影响所有线程,包括主线程。我希望您不要做太多的递归,因为48K或(类似)并没有太多的空间

现在,Paul关于异步I/O在Windows上的非性能是否正确,尤其是,我不能100%确定——我必须对其进行测量才能确定。然而,我所知道的是,关于线程编程比基于异步事件的编程更容易的论点正呈现出一种错误的二分法


异步代码不需要基于事件;它可以是基于continuation的,就像在.NET中一样,如果您指定一个闭包作为continuation,您可以免费获得状态维护。此外,从线性线程样式代码到连续传递样式异步代码的转换可以由编译器进行机械化(CPS转换是机械化的),因此在代码清晰性方面也不需要成本。

对于异步代码,请尝试IC


对于ScktComp类,您需要使用ThreadBlocking服务器,而不是非Blocking服务器类型。使用OnGetThread事件将ClientSocket参数传递给您设计的新线程。实例化继承的TServerClientThread实例后,将创建TWinSocketStream实例(在线程内部),您可以使用该实例读取和写入套接字。此方法使您不再试图在事件处理程序中处理数据。这些线程可能只存在于读取或写入所需的短时间内,或者为了被重用而挂起一段时间

编写套接字服务器的主题相当广泛。您可以选择实施许多技术和实践。在TServerClientThread中读取和写入同一套接字的方法是直接的,对于简单的应用程序来说很好。如果您需要一个高可用性和高并发性的模型,那么您需要研究Proactor模式之类的模式

祝你好运

有一个免费的IOCP(完成端口)套接字组件:(包括源代码)

“Naberegnyh Sergey N.高中 基于socket的高性能socket服务器 Windows完成端口和使用 Windows套接字扩展。IPv6 支持。”


我在寻找更好的组件/库来重新构建我的小型即时消息服务器时发现了它。我还没有尝试过,但它的第一印象似乎很好。

我想您还是需要担心在使用闭包时数据访问同步,或者所有通信都序列化了吗?这与f.x.asynch如何结合。为大量传入请求提供数据的数据库响应?使用工作线程池?您应该对此进行日志记录。Indy的线程基于VCL的TThread类,该类不允许您指定堆栈大小。如果必须手动终止套接字,则说明您没有正确使用它。Indy服务器会自动为您处理这些内容。我应该知道-我是印地开发团队的成员。至于操作系统升级,到底是什么停止了工作?澄清一下,这是Indy 9,而不是Indy 10,这可以解释为什么需要在退出时手动关闭套接字。操作系统安全补丁导致Write()调用被阻止而不返回(在XP SP2和3之间)。该应用已经运行了2年,但在安全补丁后失败。部署团队认为这是硬件,于是将应用程序移动到了第二台服务器上,得到了相同的结果。由于它是一个生产服务器,我们尝试替换ScktComp接口,一切都正常。我没有时间使用内核调试器来找出导致调用阻塞的原因。鉴于INDY是一个我不信任的组件集,ICS是一个没有IOCP支持的异步第三方组件集,我认为Embarcadero应该站出来构建一个适当的async+IOCP网络层。事实上,INDY是当前VCL企业数据库网络层下面的一层,这太糟糕了,这也是我不想用一根十英尺长的杆子去碰那堆摇摇欲坠的东西的原因。正是在Indy9到Indy10 API不稳定阶段,我开始了我的“远离INDY”阶段。我现在只使用ICS,我对它非常满意。这不是因为sync/async的问题,而是所有的小故障(特别是在应用程序关闭时挂起)和整个IdAntifreeze的问题让我厌倦了Indy。+1提到了阻塞socket提高了代码的清晰度,另一方面,非阻塞(async)套接字涉及Windows消息队列,如果涉及数百或数千个连接,它也可能成为瓶颈我发现2011年3月的这篇文章非常有趣: