标题
服务器之王! [坛主CLQ的服务器程序开发日记,综合了众多C/C++程序崩溃的原因,强烈推荐!]
clq
今天调用了一个 delphi 写的 dll,居然出现发下奇怪的错误。
--------------------------------------------------
[html]
Run-Time Error Check Failure #0—The value of ESP was not properly saved
across a function call. This is usually a result of calling a function
declared with one calling convention with a function pointer declared
with a different calling convention.
[text]
--------------------------------------------------
原来是调用格式必须为 stdcall
typedef int (__stdcall * pSaveJpeg) (char * fn1, char * fn2);
// typedef int(*pSaveJpeg)(char * fn1, char * fn2);
//必须是 stdcall,例如 typedef int(__stdcall *pSaveJpeg)(char * fn1, char * fn2);
clq
用delphi作了个连接ado的数据库接口,运行后居然问我要 MSVCP60D.DLL 和 MSVCRTD.DLL 两个 dll 。这还是debug版本的,估计 r... 版本的倒是会是另外两个dll。
clq
if ( mysql_query(&mysql, (sql).c_str() ) !=0 )
{//clq 这里也会崩溃//例如访问 http://127.0.0.1:8022/read.csp?tid=981'> 会出错
printf("mysql_query error:%s\n", mysql_error(&mysql));
mysql_close(&mysql);
return false;
}
我错了,应该检查参数.
我是马甲
今天发生了一件非常可怕的事... 有关类型 bool....
从 std::string 的现状我们已经知道,每本 C++ 书中都宣传要用这玩意代替传统字符串有多不现实(甚至是可怕). 相差内容已经很多我就不说了,虽然我还是经常用它. 但从来没有人说过使用 bool 类型会造成什么问题.
过程是这样的,我一向有个习惯,把一个程序丢进不同的编译器中去编译.只有在所以编译器都通过的情况下我才稍微安心一点(大伙不妨试试把你的服务器程序放到 VC 和 GCC 中分别编译一下,看看完全能通过的有多少,hehe). 好了具体点,一个类含有一个 std::string 成员变量.原来在VC6下好好的,在 dev C++ 4.9.9.2 下却一访问就出错而访问基本的 int 类型却是没问题的.开始我还以为是没有初始化(因为我经常在程序中手工初始化),后来以为是重载,...总之最后将它的父类中的 bool 类型改为 int 就ok了(当然得改一下相关的代码).具体原因我不知道,我开了一个新工程专门写在这些代码又是可以的.只好猜测是我用的第三方库中重定义了 bool 类型导致的.唉,bool类型可是我最喜欢的一个 C++ 元素呀. 从此...... 兄弟我欲哭无泪中.
这个例子告诉我们,在目前的C++环境中,能用基础C类型的情况下还是老老实实的用C.
我是马甲
再友情赠送一条,由于用了clq的ado连接库所以调用了 CoInitialize(NULL); 函数. 所以工程属性的"连接器"中要加上
-lole32
我是马甲
FILE * f = fopen("", "r");
这句话会崩溃,实在是匪夷所思.
我是马甲
"在这整个领域中,我始终认为最有用并且投资回报率最大的是考虑改进源代码的风格。"
[url]
http://www.newbt.net:8022/read.csp?fid=9&tid=1504
我是马甲
我还有一个秘诀 :) 尽量多的应用 STL 来代替纯 C 下的指针 ++ 等移动到下一个结构指针的方法. 在我的前一家公司,服务器中的大多数错误都来自于在一块保存结构列表的内存中进行遍历时,如果是使用stl来保存这些结构体列表,那么发生错误则几乎是不可能的.
记住 用STL来管理内存! :) 这是 CLQ 最大的经验.
clq
mod_limitipconn 的问题还是很多,甚至感觉不太实用。
首先说些注意事项,mod_limitipconn 必须要与 mod_status 同时开启才起作用(并且要有 ExtendedStatus On ).详细如这编文章
--------------------------------------------------
使用mod_limitipconn限制Apache的并发连接数
作者:kitty 日期:2007-3-14 15:26:00
mod_limitipconn可以控制每个IP地址同时连接服务器某一个目录的并发连接数,是一个非常有用的模块,其官方网页是http://dominia.org/djao/limitipconn2.html,支持Apache 2.x的模块下载,本人使用httpd-2.0.59版本。
mod_limitipconn for Apache 2.x提供三种安装方式,分别是tar包、rpm安装文件和rpm源文件,我们一般都使用tar包的安装方式。
tar xzvf mod_limitipconn-0.22.tar.gz
cd mod_limitipconn-0.22
/opt/app/apache2/bin/apxs -c -i -a mod_limitipconn.c #对mod_limitipconn.c进行编译,此命令会自动在你Apache的配置文件httpd.conf中加入需要的信息,并且将生成的mod_limitipconn.so模块拷贝到Apache的模块目录。
不过为了确认此命令是否正常运作,请首先检查自己的Apache模块目录,看内部是否含有mod_limitipconn.so文件,没有的话请将mod_limitipconn-0.04目录中生成的文件拷贝到此处。
make install
然后请确认mod_status模块已经加载,LoadModule status_module modules/mod_status.so
并且在mod_status下添加了ExtendedStatus On这一行。
这时我们的mod_limitipconn模块就安装完毕
mod_limitipconn可以对全局和虚拟主机进行不同的限制,其语法结构都是
#所限制的目录所在,此处表示主机的根目录
MaxConnPerIP 3 #所限制的每个IP并发连接数为3个
NoIPLimit image/* #对图片不做IP限制
#所限制的目录所在,此处表示主机的/mp3目录
MaxConnPerIP 1 #所限制的每个IP并发连接数为1个
OnlyIPLimit audio/mpeg video #该限制只对视频和音频格式的文件
当对全局进行限制时,将这段代码放在httpd.conf文件没有VirtualHost的地方,若是对某个虚拟主机进行限制,请将其放在和之间,我们可以通过更改Location以及MaxConnPerIP方便的控制所限制的目录和并发连接数。
最后,只要重新启动Apache服务,并发连接数的限制就可以生效
--------------------------------------------------
限制了一个目录后其子目录也受限制。但象上面所说的图片不受限制也不行,仍然危险,怎样让客户端下完一张图片再下另一张呢? 用 mod_limitipconn 应该是不行的,如果你限制图片为 3 ,那么一个网页中有多个图片时就只能显示前3张。其实它的实现应该是先响应3张,其余的等有人完成后再响应,而不是断开它 -- 也许 mod_limitipconn 中有这种选项?我没看到,它的代码其实相当短小我觉得功能不会太强。不过用来限制下载线程还是可以的,只是不太可能用来限制恶意攻击。
clq
另外 debug 编译出来的 mod_limitipconn 不能用在 re... 编译出来的 apapche 中.
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.