以下是对应构造函数的部分,大差不差。
【 在 Algoquant 的大作中提到: 】
: 以下由ds生成:
: #include <iostream>
: #include <thread>
: ...................
/***************************************************************
* 线程池模型的入口函数,主线程主要负责资源管理
*应用插件的服务函数在
* extern srvfunc Function[];
*/
int TPOOL_srv(void (*conn_init)(T_Connect *,T_NetHead *),void (*quit)(int),void (*poolchk)(void),int sizeof_gda)
{
int ret,i;
int s;
struct sockaddr_in sin,cin;
struct servent *sp;
char *p;
struct timeval tm;
fd_set efds;
socklen_t leng=1;
int sock=-1;
srvfunc *fp;
TCB *task;//Task Control Block
struct linger so_linger;
signal(SIGPIPE,SIG_IGN);
signal(SIGHUP,SIG_IGN);
signal(SIGINT ,SIG_IGN);
signal(SIGPWR ,quit);
signal(SIGTERM,quit);
p=getenv("SERVICE");
if(!p || !*p) {
ShowLog(1,"缺少环境变量 SERVICE ,不知守候哪个端口!");
quit(3);
}
//测试端口是否被占用
sock=tcpopen("localhost",p);
if(sock>-1) {
ShowLog(1,"端口 %s 已经被占用",p);
close(sock);
sock=-1;
quit(255);
}
ret=tpool_init(sizeof_gda);//先启动线程池,同时初始化TCB,gda是全局数据区,实际上是这个线程的独享数据区。尺寸。
if(ret) return(ret);
for(fp=Function;fp->funcaddr!=0;fp++) rpool.svc_num++;//这个服务器里边有多少个应用函数
other_yield=set_yield(do_yield);//设置异步IO
bzero(&sin,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
if(isdigit(*p)){
sin.sin_port=htons((u_short)atoi(p));
} else {
if((sp=getservbyname(p,"tcp"))==NULL){
ShowLog(1,"getsrvbyname %s error",p);
quit(3);
}
sin.sin_port=(u_short)sp->s_port;
}
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock < 0) {
ShowLog(1,"open socket error=%d,%s",errno,
strerror(errno));
quit(3);
}
bind(sock,(struct sockaddr *)&sin,sizeof(sin));
leng=1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&leng,sizeof(leng));
//避免 TIME_WAIT
so_linger.l_onoff=1;
so_linger.l_linger=0;
ret=setsockopt(sock, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);
if(ret) ShowLog(1,"set SO_LINGER err=%d,%s",errno,strerror(errno));
listen(sock,client_q.max_client);//有多少task就有多少侦听队列,防ddos
ShowLog(0,"main start tid=%lx sock=%d",pthread_self(),sock);
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*