#include "routeserver.h"
int main(int argc,char *argv[])
{
char usage[]="usage: routeserver [-p cfgpath] [-c cfgfile] [-d cfgdomain]";
int lsnport;
char lsnip[16],str[6];
THINK_NET *net;
THINK_CFG *cfg;
int r_net,r_timer;
THINK_OPTARRAY optarray[3]={
{'p',cfgpath,sizeof(cfgpath),THINK_OPT_ARG,NULL},
{'c',cfgfile,sizeof(cfgfile),THINK_OPT_ARG|THINK_OPT_NOT_EMPTY,NULL},
{'d',cfgdomain,sizeof(cfgdomain),THINK_OPT_ARG,NULL}
};
THINK_CFGARRAY cfgarray[8]={
{cfgdomain,"logname",log_name,sizeof(log_name),0,NULL},
{cfgdomain,"logflags",log_flags,sizeof(log_flags),0,NULL},
{cfgdomain,"logaddr",log_addr,sizeof(log_addr),0,NULL},
{cfgdomain,"routeid",&route_id,sizeof(route_id),THINK_CFG_INT|THINK_CFG_NOT_EMPTY,NULL},
{cfgdomain,"nextroutes",next_routes,sizeof(next_routes),0,NULL},
{cfgdomain,"alivetime",&alive_time,sizeof(alive_time),THINK_CFG_INT|THINK_CFG_NOT_EMPTY,NULL},
{cfgdomain,"lsnaddr",lsn_addr,sizeof(lsn_addr),THINK_CFG_NOT_EMPTY,NULL},
{cfgdomain,"lsnaddr_ctrl",lsn_addr_ctrl,sizeof(lsn_addr_ctrl),THINK_CFG_NOT_EMPTY,NULL}
};
/* signal set */
signal(SIGPIPE,SIG_IGN);
/* get options from command line */
if(think_getopts(argc,argv,optarray,3)<0){
think_showerror();
return -1;
}
/* get cfgs from cfg file */
if((cfg=think_loadcfg(cfgfile,cfgpath))==NULL){
think_showerror();
return -1;
}
if(think_getcfgs(cfg,cfgarray,8)<0){
think_showerror();
return -1;
}
think_freecfg(cfg);
/* init next router list */
initrouterlist(next_routes);
/* net start */
think_netstart();
/* netcenter */
netcenter=think_netcenter_new();
/* listening ctrl port ... */
think_strgetfield(lsn_addr_ctrl,':',0,lsnip,sizeof(lsnip));
think_strgetfield(lsn_addr_ctrl,':',1,str,sizeof(str));
lsnport=atol(str);
if((net=think_netlisten(lsnip,lsnport))==NULL){
think_showerror();
return -1;
}
think_netcenter_netadd(netcenter,net,acceptnewclient_ctrl);
lsnnet_ctrl=net; /* lsnnet_ctrl */
/* listening normal port ... */
think_strgetfield(lsn_addr,':',0,lsnip,sizeof(lsnip));
think_strgetfield(lsn_addr,':',1,str,sizeof(str));
lsnport=atol(str);
if((net=think_netlisten(lsnip,lsnport))==NULL){
think_showerror();
return -1;
}
think_netcenter_netadd(netcenter,net,acceptnewclient);
lsnnet=net; /* lsnnet */
/* open log */
if((lp=think_logopen(log_addr,log_name,think_loggetflags(log_flags)))==NULL){
think_showerror();
return -1;
}
/* idle */
think_logsend(lp,THINK_LOG_PRINT,"system","working ...");
while(1){
think_logsend(lp,0,"system","netcenter idle ...");
if((r_net=think_netcenter_idle(netcenter,-1))<0){
think_logsend(lp,THINK_LOG_ERROR|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
think_showerror();
break;
}
think_logsend(lp,0,"system","timerlist idle ...");
r_timer=think_timerlist_idle(&timerlist);
if(r_net==0 && r_timer==0)
think_sleep(10);
}
/* net stop */
think_netstop();
return 0;
}
void acceptnewclient(THINK_NETCENTER_NET *net,int event)
{
THINK_NET *client;
switch(event){
case THINK_NETCENTER_ACCEPT:
if((client=think_netaccept(net->net))==NULL){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
return;
}
think_logsend(lp,THINK_LOG_INFO|THINK_LOG_PRINT,"network","connected by %s:%d",client->ip,client->port);
cliunitadd(client);
break;
case THINK_NETCENTER_ERROR:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net error on connect [%s:%d]",net->net->ip,net->net->port);
break;
default:
break;
}
}
void clientnethandle(THINK_NETCENTER_NET *net,int event)
{
char msgbuf[1024];
int msglen;
int r;
switch(event){
case THINK_NETCENTER_DATARECVED:
/* check msg */
while(1){
if((r=think_netcenter_ismsgok(net))<0){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel(net);
return;
}
if(r==0)
break;
/* recv msg */
if((msglen=think_netcenter_recvmsg(net,msgbuf,sizeof(msgbuf)))<0){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel(net);
return;
}
/* process msg */
if(clientmsgprocess(net,msgbuf,msglen)<0){
think_logsend(lp,THINK_LOG_ERROR|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel(net);
think_netcenter_netdel(netcenter,net->net);
return;
}
}
break;
case THINK_NETCENTER_DISCONNECTED:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net disconnected [%s:%d]",net->net->ip,net->net->port);
cliunitdel(net);
break;
case THINK_NETCENTER_ERROR:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net error on connect [%s:%d]",net->net->ip,net->net->port);
cliunitdel(net);
break;
default:
break;
}
}
int clientmsgprocess(THINK_NETCENTER_NET *net,char *msgbuf,int msglen)
{
char msgtype[3];
bzero(msgtype,sizeof(msgtype));
if(think_gl_get(msgbuf,msglen,1,'C',2,msgtype,sizeof(msgtype))<0)
return -1;
if(strcmp(msgtype,"00")==0){
if(client_test(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"10")==0){
if(client_login(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"12")==0){
if(client_logout(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"20")==0){
if(client_msgroute(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"30")==0){
if(client_routenotice(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"40")==0){
if(client_ping(net,msgbuf,msglen)<0)
return -1;
}else{
think_error(0,"[%s]:unsupported msgtype[%s]",__func__,msgtype);
return -1;
}
return 0;
}
void acceptnewclient_ctrl(THINK_NETCENTER_NET *net,int event)
{
THINK_NET *client;
switch(event){
case THINK_NETCENTER_ACCEPT:
if((client=think_netaccept(net->net))==NULL){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
return;
}
think_logsend(lp,THINK_LOG_INFO|THINK_LOG_PRINT,"network","connected by %s:%d",client->ip,client->port);
cliunitadd_ctrl(client);
break;
case THINK_NETCENTER_ERROR:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net error on connect [%s:%d]",net->net->ip,net->net->port);
break;
default:
break;
}
}
void clientnethandle_ctrl(THINK_NETCENTER_NET *net,int event)
{
char msgbuf[1024];
int msglen;
int r;
switch(event){
case THINK_NETCENTER_DATARECVED:
/* check msg */
while(1){
if((r=think_netcenter_ismsgok(net))<0){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel_ctrl(net);
return;
}
if(r==0)
break;
/* recv msg */
if((msglen=think_netcenter_recvmsg(net,msgbuf,sizeof(msgbuf)))<0){
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel_ctrl(net);
return;
}
/* process msg */
if(clientmsgprocess_ctrl(net,msgbuf,msglen)<0){
think_logsend(lp,THINK_LOG_ERROR|THINK_LOG_PRINT,"network","%s",__think_errmsg__);
cliunitdel_ctrl(net);
think_netcenter_netdel(netcenter,net->net);
return;
}
}
break;
case THINK_NETCENTER_DISCONNECTED:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net disconnected [%s:%d]",net->net->ip,net->net->port);
cliunitdel_ctrl(net);
break;
case THINK_NETCENTER_ERROR:
think_logsend(lp,THINK_LOG_WARN|THINK_LOG_PRINT,"network","net error on connect [%s:%d]",net->net->ip,net->net->port);
cliunitdel_ctrl(net);
break;
default:
break;
}
}
int clientmsgprocess_ctrl(THINK_NETCENTER_NET *net,char *msgbuf,int msglen)
{
char msgtype[3];
bzero(msgtype,sizeof(msgtype));
if(think_gl_get(msgbuf,msglen,1,'C',2,msgtype,sizeof(msgtype))<0)
return -1;
if(strcmp(msgtype,"10")==0){
if(_logopen(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"20")==0){
if(_logsend(net,msgbuf,msglen)<0)
return -1;
}else if(strcmp(msgtype,"30")==0 || strcmp(msgtype,"40")==0){
if(_logview(net,
没有合适的资源?快使用搜索试试~ 我知道了~
think库 (跨平台C语言库)
共154个文件
c:47个
h:24个
dsw:20个
4星 · 超过85%的资源 需积分: 31 82 下载量 20 浏览量
2009-09-27
18:22:10
上传
评论 1
收藏 157KB ZIP 举报
温馨提示
转这个代码主要是看代码质量还行. 看了一下提供的功能还是蛮全的. 没有积累的朋友.可以搜刮一下其中可用的部分. 转自CSDN的enigma1983 提供跨平台的C语言库,各类C、C++程序都可以用到其中的东西,已支持AIX、HP-UX、Solaris、FreeBSD、Linux、Mac OS X和Windows操作系统 辛苦了四年,颠覆多次,终成这个发布版,现在作为unix-center的开源项目,任何非册用户进入此链接都可以下载 有兴趣的先顶一下,便于后面的伙计看到此贴。 第二版主要增加了进程通讯的一些东西,包括线程,线程锁,进程锁,信号量,共享内存及由信号量与共享内存实现的消息队列.
资源推荐
资源详情
资源评论
收起资源包目录
think库 (跨平台C语言库) (154个子文件)
build.bat 853B
buildclean.bat 213B
build.bat 188B
build.bat 78B
build.bat 76B
build.bat 76B
build.bat 68B
buildclean.bat 45B
buildclean.bat 45B
buildclean.bat 45B
buildclean.bat 45B
buildclean.bat 45B
routeserver.c 32KB
logserver.c 25KB
think_utility.c 20KB
think_dbf.c 18KB
think_db.c 18KB
think_cfg.c 11KB
think_net.c 11KB
think_netcenter.c 10KB
logview.c 7KB
think_gl.c 7KB
think_log.c 7KB
think_shmq.c 7KB
think_conf.c 6KB
think_thread.c 5KB
think_mutex.c 4KB
think_sem.c 4KB
think_timer.c 4KB
think_route.c 3KB
think_shm.c 3KB
think_threadmutex.c 3KB
dbfshow.c 2KB
dbshow.c 2KB
handtest.c 2KB
think_file.c 2KB
threadtest.c 2KB
logsend.c 2KB
dbfload.c 1KB
dbload.c 1KB
shmqrm.c 1KB
dbfinsert.c 1KB
shmqstat.c 1KB
dbinsert.c 1KB
dbfstat.c 979B
dbstat.c 942B
shmqget.c 880B
shmqput.c 826B
think_error.c 802B
getcfg.c 787B
shmqcreate.c 703B
getconf.c 663B
showcfg.c 540B
showconf.c 522B
dbfcreate.c 481B
dbcreate.c 449B
showerr.c 280B
think_mdb.c 23B
think_os.c 22B
routeserver.cfg 153B
logserver.cfg 82B
think.dsp 6KB
logserver.dsp 5KB
dbfcreate.dsp 5KB
dbfinsert.dsp 5KB
shmqcreate.dsp 5KB
threadtest.dsp 5KB
dbfshow.dsp 5KB
dbfstat.dsp 5KB
dbfload.dsp 5KB
logsend.dsp 5KB
shmqstat.dsp 5KB
showconf.dsp 5KB
logview.dsp 5KB
getconf.dsp 5KB
shmqget.dsp 5KB
shmqput.dsp 5KB
showerr.dsp 5KB
getcfg.dsp 5KB
showcfg.dsp 5KB
think_dbf.dsp 3KB
threadtest.dsw 514B
shmqcreate.dsw 514B
think_dbf.dsw 512B
logserver.dsw 512B
dbfinsert.dsw 512B
dbfcreate.dsw 512B
shmqstat.dsw 510B
showconf.dsw 510B
dbfload.dsw 508B
showerr.dsw 508B
shmqput.dsw 508B
logsend.dsw 508B
getconf.dsw 508B
shmqget.dsw 508B
dbfshow.dsw 508B
logview.dsw 508B
showcfg.dsw 508B
dbfstat.dsw 508B
getcfg.dsw 506B
共 154 条
- 1
- 2
资源评论
- zyaaaaaaa2018-11-25没什么用啊
- wdohc2012-11-16确实不错,可以调用
- moonfisher2013-07-08确实不错,可以调用
- jzwsc2015-04-15改造了一下,不错,这个还是挺好的
rendao0563
- 粉丝: 123
- 资源: 163
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功