真正的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来开发的,真的是非常稳定的更多相关文章

  1. Linux网络编程:基于TCP的程序开发回顾篇《转》

    面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...

  2. 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制   阅读 ...

  3. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  4. 基于FPGA的以太网开发

    基于FPGA的以太网开发,在调试过的FPGA玩家开来,其实算不上很难的技术!但是如果只是菜鸟级别的选手,没有调试过的话,就有些头疼了!早在自己在实习的时候,就接触到XAUI(万兆以太网口)接口,但是由 ...

  5. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  6. [转]基于Starling移动项目开发准备工作

    最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...

  7. 最新基于adt-bundle-windows-x86的android开发环境筹建

    最新基于adt-bundle-windows-x86的android开发环境搭建 某系统要配套做一个android客户端,来一次android开发环境快速搭建,系统Win7,具体步骤如下: 1.下载j ...

  8. 基于Typecho CMS框架开发大中型应用

    基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...

  9. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

随机推荐

  1. .net core demo & docker images

    记录.net core 部署在docker 上的大概步骤便于以后查阅. PART 1 .net core web api demo 1.下载最新VS 2015 community 社区版免费使用. 2 ...

  2. 值初始化-new

    程序如下#include<iostream>using namespace std; int main(){        int *a=new int(1);        int *b ...

  3. IOCP模型总结(转)

    IOCP模型总结(转) IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型.它是应用程序使用线程池处理异步I/O请求的一种机制.在处理多个并发的异步I/O请求 ...

  4. Xamarin android PreferenceActivity 实现应用程序首选项设置(一)

    应用程序首选项屏幕 类似系统设置界面. PreferenceActivity 是另一种类型的Activity,通过PreferenceActivity 可以以最少量的工作显示某些Preference列 ...

  5. TCL_事务控制语言

    TCL     transaction  事务   --  DML            定义为把一连串的操作作为单个逻辑工作单元处理                -----     例如:银行转账 ...

  6. 利用Linux下的pthread_mutex_t类型来实现哲学家进餐问题

    首先说一下什么是哲学家进餐问题,这是操作系统课程中一个经典的同步问题, 问题如下:如上图,有6个哲学家和6根筷子(那个蓝色部分表示哲学家,那个紫色长条部分表示筷子),他们分别被编了0~5的号!如果某个 ...

  7. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2

    //格式为sring输出 //   Label1.Text = string.Format("asdfadsf{0}adsfasdf",a); //   Label2.Text = ...

  8. T-SQL数组循环

    T-SQL对字符串的处理能力比较弱,比如要循环遍历象1,2,3,4,5这样的字符串,如果用数组的话,遍历很简单,但是T-SQL不支持数组,所以处理下来比较麻烦.下边的函数,实现了象数组一样去处理字符串 ...

  9. laravel--上传

    1.视图里面 2.控制器里面 //收集表单提交数据 $input = $request->all(); //查看是否有图片提交上来 if ($request->hasFile('title ...

  10. 字符设备驱动中cdev与inode、file_operations的关系

    一.cdev与inode 二.cdev与file_operations