- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2010-07-22 11:18 编辑
回复 yulihua49
呵呵,恭喜你搞定服务器开发了。
没本 发表于 2010-07-20 18:20 ![]()
已经进行16000多连接,稳定。
超额的等待,等不起的挂断,服务器是不会死的。
不会发生当用户蜂拥而至时,服务器自杀的情况。
连上的进行协议验证,不符合协议(对不上黑话)的推出午门斩首,绝不会让这些反贼坏了江山。
只是在写服务时一定要注意线程安全,内存严谨,这个堡垒只能由内部攻破。
看看服务器框架的运用:- #include <unistd.h>
- #include <ctype.h>
- #include <sys/resource.h>
- #include "../thread/thrsrv.h"
- extern int tpool_main(void (*conn_init)(T_Connect *,T_NetHead *),void (*quit)(int),void (*poolchk)(void),int sizeof_gda);
- extern void tpool_free(void);
- //定义服务函数
- srvfunc Function[]={
- {login,"login"}, /*0 login.c */
- {Echo,"Echo"}, /*1*/
- {Rexec, "Rexec"},
- {GetFile,"GetFile"},
- {PutFile,"PutFile"},
- {Pwd,"Pwd"},
- {filels,"filels"},
- {SQL_Select,"SQL_Select"},
- {page_select,"page_select"},
- {dui_svc,"dui_svc"},
- {SQL_RPC,"SQL_RPC"},
- {net_showlog,"net_showlog"},
- {0,0}
- };
- void quit(int n)
- {
- free_DB_pool();
- tpool_free();
- ShowLog(0,"quit by %d",n);
- exit(n);
- }
- //连接已收到,初始化连接器。
- void sc_init(T_Connect *conn,T_NetHead *head)
- {
- char *env;
- char cp[21];
- T_SRV_Var *sp;
- GDA *gp;
- sp=(T_SRV_Var *) conn->Var;
- gp=(GDA *)sp->var;
- if(gp) *gp->ShowID=0;
- env=getenv("SENDSIZE");
- if(env && *env) {
- conn->MTU=atoi(env);
- }
- peeraddr(conn->Socket,cp);;
- ShowLog(0,"tid %lu 连接:%s ",pthread_self(),cp);
- /* 在此设置事件处理 */
- // connect->Event_proc=事件设置函数;
- }
- void FreeVar(void *data)
- {
- }
- static char my_showid[200];
- int main(int argc,char *argv[])
- {
- int ret;
- struct rlimit sLimit;
- char *p;
- //设置可以core dumpped
- sLimit.rlim_cur = -1;
- sLimit.rlim_max = -1;
- ret=setrlimit(RLIMIT_CORE,(const struct rlimit *)&sLimit);
- if(argc>1) ret=envcfg(argv[1]);
- p=getenv("COL_TO_LOWER");
- if(p && isdigit(*p)) col_to_lower=atoi(p);
- sprintf(my_showid,"%s:%d",sc_basename(argv[0]),getpid());
- Showid=my_showid;
- ret=init_DB_pool();
- if(ret) {
- ShowLog(1,"init_DB_pool:fail");
- return 1;
- }
- //调用线程池服务器框架。它将根据客户请求的服务号调用服务函数。
- tpool_main(sc_init,quit,dbpool_check,sizeof(GDA));//GDA用户自定义的上下文,告它一个尺寸,内部自己分配
- quit(0);
- }
复制代码 服务函数的例子在4页31楼。
要想定义一个服务,只需;
按照框架规定的格式接受自变量和提供返回值,按照与客户端约定的流程处理业务。
函数原型加入公共头文件(../thread/thrsrv.h)。
加入服务器函数表。
Makefile里增加一个模块。 |
|