归档 2009年12月10日

最后更新于 .

最近需要上线的逻辑server由于需要与大量的后台server交互,今天突然发现有大量的close_wait产生,于是仔细研究了一下:
首先我们知道,如果我们的服务器程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!
因为如果是CLIENT端主动断掉当前连接的话,那么双方关闭这个TCP连接共需要四个packet:

Client?--->?FIN??--->?Server
Client?<---?ACK??<---?Server


这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。

Client?<---?FIN??<---?Server


这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。

Client?--->?ACK??--->?Server


Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。

Server 程序处于CLOSE_WAIT状态,而不是LAST_ACK状态,说明还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。
通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(这个时间外网服务器通?;嶙龅髡?,要不然太危险了)。如果有个流氓特地写了个程序,给你造成一堆的CLOSE_WAIT,消耗
你的资源,那么通常是等不到释放那一刻,系统就已经解决崩溃了 ...

最后更新于 .

这几天在写一个server,由于框架相同,仅仅是获取数据源的地方有区别,所以,研究了一下如何使用面向对象的方法来动态加载so。

主要思想就是:
1.通过一个函数能够获得一个基类的指针,这样在调用基类的函数的时候,就能自动调用子类的实现了。
2.存储so对象的指针应该是外层类的一个static变量。

详细还是看代码吧:
1)首先定义一个公共的头文件,里面存储的基类的定义:(需要注意的就是,只要不是纯虚函数,那么就一定要有实现;还有就是析构函数需要为虚函数)
so和主调程序都需要包含这个头文件。
source_base.h

#ifndef?_SOURCE_BASE_H_
#define?_SOURCE_BASE_H_
#include?<iostream>
using?namespace?std;
class?CSourceBase;
/**?
?* @brief????获取实例
?*?
?* @param????client????????new出的指针
?*?
?* @return????0????????????succ
?*?????????????else????????fail
?*/
extern?“C”?int?CreatObj(CSourceBase?*&?client);
class?CSourceBase
{
????public:
????????CSourceBase ...

昨天

2009年12月8日

明天

2009年12月17日

归档