基于http.sys来开发的,真的是非常稳定
真正的WEB服务器是不会用Indy写的。因为它是基于每连接每线程的。
其实真正的服务器需要下很多功夫,无法快速开发的。
比如说,字符串处理。玩服务器基本上就是玩内存。举个例子:
var
str:AnsiString;
begin
str:='HTTP 1.1/200 OK'#$D#$A;
str:=str+xxxxxxx;
str:=str+yyyyyyy;
......
end;
编译器实际上上怎么做的?第一行代码:先根据字符长度,为str分配17字节空间(这里不讨论头部计数器和锁占用的空间)。第二行代码,假设xxxxxx的长度为3,那么再申请一个20字节的空间,将原来17字节的内容拷贝过去,再在后面接上3个字节的内容,然后释放原来的17个字节。第三行同理。内存会变成怎么样?
[ 17个字节的空洞][ 20字节的新内容]..........
这个时候,如果你需要分配一个18字节的内存,只能从[ 20字节的新内容]后面申请,因为内存块必须是连续的。换句话说,前面那个17字节的内存就废了。除非分配的是小于等于17字节的。
随着运行的时间越来越长,类似的空洞会越来越多。最后,如果你是32位应用程序,那么有可能面临很多错误(比如说:GetMem失败,对象创建失败)。
MFC的CString实质上原理类似。
服务器开发跟桌面应用是两码事,因为桌面应用程序,从你启动到结束,一般就运行几个小时,但服务器是24小时*365运行的,需要注意的事情海了去。很多时候,一些好像不要紧的细节,累加起来,就有质的区别。
服务器开发,不是有一个不错的网络库就OK的。网络仅是负责数据的收发,你如何快速处理收到的数据呢(比如说,使用传统锁来生产者消费者队列,或者双队列,或者原子队列,或者真正逻辑上完全无锁队列)?如果避免更多的内核和应用层切换?启动多少个线程刚好合适?选用什么加密算法?等等等等。不要小看效率,假如你的服务器长连接峰值是10万,一个加密算法提示了10毫秒,10毫秒乘以10万就是16分钟,8核服务器在理想状态下,最后那个登录的可怜虫也要多等待2分钟。仅仅追求连接数是毫无意义的,如果你的机器性能够强大,如果你使用完成端口,如果客户端仅是连接而不用做其它事情,一个最蹩脚的程序员写的也能同时支持百万级别的连接。但这个是操作系统的功劳,跟你的程序关系不大。仅连接不做事情的程序也没什么用处。
当然,桌面程序开发人员是不用关心这些的。如果仅是开发http server,我强烈建议直接调用操作系统的http.sys,这个也是IIS的本质。除了避免内核和应用层的切换,还可以避免很多问题。你自己实现一个其实是不可能比这个更好---你用的操作系统都是人家的,你会比他更了解系统么?
http://bbs.2ccc.com/topic.asp?topicid=517080
http://www.codeproject.com/Articles/437733/Demystify-http-sys-with-HttpSysManager
http://blog.synopse.info/tag/http.sys
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364510(v=vs.85).aspx
基于http.sys来开发的,真的是非常稳定的更多相关文章
- Linux网络编程:基于TCP的程序开发回顾篇《转》
面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...
- 基于TINY4412的Andorid开发-------简单的LED灯控制【转】
本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制 阅读 ...
- 基于ASP.Net Core开发的一套通用后台框架
基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...
- 基于FPGA的以太网开发
基于FPGA的以太网开发,在调试过的FPGA玩家开来,其实算不上很难的技术!但是如果只是菜鸟级别的选手,没有调试过的话,就有些头疼了!早在自己在实习的时候,就接触到XAUI(万兆以太网口)接口,但是由 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- [转]基于Starling移动项目开发准备工作
最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...
- 最新基于adt-bundle-windows-x86的android开发环境筹建
最新基于adt-bundle-windows-x86的android开发环境搭建 某系统要配套做一个android客户端,来一次android开发环境快速搭建,系统Win7,具体步骤如下: 1.下载j ...
- 基于Typecho CMS框架开发大中型应用
基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
随机推荐
- jLink(v8)GDB 命令总结
/** ****************************************************************************** * @author Maox ...
- webpack+react+jquery和jquery插件
要引入jquery插件 全局引入jquery plugins : [new webpack.ProvidePlugin({ $: 'jquery', jQuery:'jquery' "win ...
- [Database][SQL] 取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
取得SQLServer中某一欄位名稱所在的資料表及欄位相關資訊
- PHP实现冒泡算法
<?php //php函数:count($arr)返回array的数值总数. function bubble_sort($arr){ for ($i = 6;$i > 0;$i --){ ...
- Spark Streaming揭秘 Day8 RDD生命周期研究
Spark Streaming揭秘 Day8 RDD生命周期研究 今天让我们进一步深入SparkStreaming中RDD的运行机制.从完整的生命周期角度来说,有三个问题是需要解决的: RDD到底是怎 ...
- 移植openssl
1.官网(ftp://ftp.openssl.org/source/old/0.9.x/)下载openssl-0.9.8k.tar.gz2.交叉编译openssl CC=arm-hisiv400-li ...
- PCB优化设计(转载)
PCB优化设计(一) 2011-04-25 11:55:36| 分类: PCB设计 目 前SMT技术已经非常成熟,并在电子产品上广泛应用,因此,电子产品设计师有必要了解SMT技术的常识和可制造性 ...
- (转载)Cocos2dx-OpenGL ES2.0教程:你的第一个立方体(5)
在上篇文章中,我们介绍了VBO索引的使用,使用VBO索引可以有效地减少顶点个数,优化内存,提高程序效率. 本教程将带领大家一起走进3D–绘制一个立方体.其实画立方体本质上和画三角形没什么区别,所有的模 ...
- sql之透视
1.透视原理:就是将查询结果进行转置 下面就举例来说明: 执行下面语句:检查是否含有表 dbo.Orders,如果有就将表删除: if OBJECT_ID('dbo.Orders','U') is n ...
- Contest2037 - CSU Monthly 2013 Oct (problem D :CX and girls)
[题解]: 最短路径问题,保证距离最短的同时,学妹权值最大,哈哈 [code]: #include<iostream> #include<queue> #include< ...