b_4 CConnector::Run() { ACE_INET_Addr LocalAddr(m_Conf.GetLocalPort()); ACE_INET_Addr RemoteAddr(m_Conf.GetRemotePort(), m_Conf.GetRemoteIP()); while (CNetworkManager::Instance()->IsRunning() && m_Conf.Reconnect()) { CConnectorHandle *pHandle = null_v; if (0 == connect(pHandle, RemoteAddr, ACE_Synch_Options::defaults, LocalAddr)) { m_pHandle = pHandle; while (pHandle->IsRunning()) ACE_OS::sleep(5); } ACE_OS::sleep(3); } return 0; }
//连接 static int sc_connect(pool *p1,resource *rs) { int ret=-1; T_NetHead Head; struct utsname ubuf; char buf[200],*p,addr[20]; log_stu logs; rs->Conn.timeout=-1; ret=Net_Connect(&rs->Conn,&rs->cli,*p1->log.family?p1->family:NULL); if(ret) { rs->cli.Errno=errno; stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); return -1; } //login uname(&ubuf); p=buf; Head.O_NODE=LocalAddr(rs->Conn.Socket,addr); p+=sprintf(p,"%s|%s|%s,%s|||",p1->log.DEVID,p1->log.LABEL, ubuf.nodename,addr); rs->Conn.MTU=p1->log.MTU; Head.PROTO_NUM=0; Head.D_NODE=p1->log.NEXT_d_node; Head.ERRNO1=rs->Conn.MTU; Head.ERRNO2=Head.PKG_REC_NUM=0; Head.data=buf; Head.PKG_LEN=strlen(Head.data); ret=SendPack(&rs->Conn,&Head); ret=RecvPack(&rs->Conn,&Head); if(ret) { rs->cli.Errno=errno; stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); disconnect(&rs->Conn); ShowLog(1,"%s:network error %d,%s",__FUNCTION__,rs->cli.Errno,rs->cli.ErrMsg); rs->cli.Errno=-1; return -2; } if(Head.ERRNO1 || Head.ERRNO2) { ShowLog(1,"%s:login error ERRNO1=%d,ERRNO2=%d,%s",__FUNCTION__, Head.ERRNO1,Head.ERRNO2,Head.data); disconnect(&rs->Conn); stptok(Head.data,rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0); rs->cli.Errno=-1; return -3; } net_dispack(&logs,Head.data,log_tpl); strcpy(rs->cli.DBOWN,logs.DBOWN); strcpy(rs->cli.UID,logs.DBUSER); //取服务名 ret=init_svc_no(&rs->Conn); rs->cli.Errno=ret; *rs->cli.ErrMsg=0; return ret; }
static void * thread_work(void *param) { T_Connect Conn=*(T_Connect *)param; T_NetHead Head; int ret,logined=0; T_SRV_Var ctx; srvfunc *fp; int svcnum=0; int (*init)(T_Connect *conn,T_NetHead *head); char addr[16]; char gda[Conn.SendLen+1];//本线程的全局数据区必须在此分配。 ((T_Connect *)param)->Socket=-1;//通知主线程 if(Conn.SendLen>0) ctx.var=gda; else ctx.var=0; Conn.SendLen=0; ctx.tid=pthread_self();//标志多线程服务 ctx.poolno=0; ctx.SQL_Connect=NULL; ctx.TCB_no=-1; //标志不是线程池 Conn.Var=&ctx; init=Conn.only_do; Conn.only_do=0; //借用only_do存放函数地址 conn_init if(!Conn.only_do) for(fp=Function;fp->funcaddr!=0;fp++) svcnum++; // ShowLog(2,"%s:tid=%lX,sock=%d",__FUNCTION__,ctx.tid,Conn.Socket); // 协商密钥 Conn.CryptFlg=mk_clikey(Conn.Socket,&Conn.t,Conn.family); if(Conn.CryptFlg<0) { //协商密钥失败 LocalAddr(Conn.Socket,addr); ShowLog(1,"%s:tid=%lX addr=%s,协商密钥失败!",__FUNCTION__, ctx.tid,addr); freeconnect(&Conn); return NULL; } if(init) init(&Conn,&Head); while(1) { ret=RecvPack(&Conn,&Head); if(ret<0) { ShowLog(1,"%s:tid=%lX,接收结束,sock=%d,status=%d,%s", __FUNCTION__,ctx.tid,Conn.Socket,errno,strerror(errno)); break; } ShowLog(4,"%s: tid=%lX,PROTO_NUM:%d PKG_LEN=%d,T_LEN=%d",__FUNCTION__,ctx.tid, Head.PROTO_NUM,Head.PKG_LEN,Head.T_LEN); if(Head.PROTO_NUM==1){ Echo(&Conn,&Head); continue; } if(Head.PROTO_NUM==0xFFFF){ ShowLog(0,"%s:Disconnect by client,tid=%lX",__FUNCTION__,ctx.tid); break; } if(!Head.PROTO_NUM) { if(!logined) { logined=Function[0].funcaddr(&Conn,&Head); if(logined==-1) break; } else { get_srvname(&Conn,&Head); } } else if(Conn.only_do) { ret=Conn.only_do(&Conn,&Head); continue; } else { if(!logined) {//未登录 ShowLog(1,"%s:未登录,tid=%lX",__FUNCTION__,ctx.tid); break; } if(Head.PROTO_NUM>svcnum) { ShowLog(1,"%s:没有这个服务号 %s",__FUNCTION__,Head.PROTO_NUM); break; } ret=Function[Head.PROTO_NUM].funcaddr(&Conn,&Head); if(ret==-1) { ShowLog(0,"%s:Disconnect by server PROTO_NUM=%d,ret=%d", __FUNCTION__,Head.PROTO_NUM,ret); break; } } } freeconnect(&Conn); mthr_showid_del(ctx.tid); return NULL; }
/* file_list: server */ int filels(T_Connect *conn,T_NetHead *NetHead) { char *buff,*env,*p; char *p1; char tmp[1000],dir[512],tmp1[2000]; FILE *fd; int ret; char buffer[SDBC_BLKSZ]; int Event_no=NetHead->PROTO_NUM; if(!NetHead->PKG_LEN) { ShowLog(1,"getlist what to list?"); NetHead->ERRNO1=-1; errret: NetHead->PROTO_NUM=PutEvent(conn,Event_no); NetHead->data=0; NetHead->PKG_LEN=0; NetHead->ERRNO2=-1; NetHead->PKG_REC_NUM=0; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); return 0; } buff=malloc(NetHead->PKG_LEN+200); if(!buff) { NetHead->ERRNO1=-2; goto errret; } strcpy(buff,NetHead->data); //ShowLog(5,"errno2=%d %s",NetHead->ERRNO2,buff); if(!strncmp(buff,"$/",2)) { env=getenv("SENDDIR"); p=buff+1; } else if(!strncmp(buff,"@/",2)) { env=getenv("HOME"); p=buff+1; } else if(*buff=='$') { p=stptok(buff+1,tmp,sizeof(tmp),"/"); env=getenv(tmp); } else { p=buff; } if(p>buff) { if(!env||!*env) env="."; if(env[strlen(env)-1]=='/') env[strlen(env)-1]=0; strcpy(tmp,env); //ShowLog(5,"%s:env=%s,buff=%s",__FUNCTION__,env,buff); strsubst(buff,p-buff,tmp); } ShowLog(5,"filelist:path=%s",buff); sprintf(tmp,"ls %s",buff); if(isdir(buff)>0) strcpy(dir,buff); else { p1=strrchr(buff,'/'); if(p1) { *p1=0; strcpy(dir,buff); } else strcpy(dir,"."); } if(dir[strlen(dir)-1]=='/') dir[strlen(dir)-1]=0; fd=popen(tmp,"r"); if(!fd) { ShowLog(1,"%s:err=%d",tmp,errno); free(buff); NetHead->ERRNO1=errno; goto errret; } //ShowLog(5,"tmp=%s",tmp); p=buffer; *p=0; while((ret=fscanf(fd,"%s",tmp))==1) { if(*buffer==0 && tmp[strlen(tmp)-1] == ':') {//没找到 break; } p1=sc_basename(tmp); ret=sprintf(tmp1,"%s/%s",dir,p1); if(isrfile(tmp1)<=0) continue; //not readble reg file /* send tmp1 to client */ if((int)(buffer+sizeof(buffer)-2-p)>ret) { p=stpcpy(p,tmp1); } else { //ShowLog(5,"%s",buffer); NetHead->PROTO_NUM=0; NetHead->data=buffer; NetHead->PKG_LEN=strlen(NetHead->data); NetHead->ERRNO2= PACK_CONTINUE; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); if(ret) break; p=buffer; p=stpcpy(p,tmp1); *p++ = ' '; *p=0; } } pclose(fd); if(*buffer) { //ShowLog(5,"final %s",buffer); NetHead->PROTO_NUM=0; NetHead->data=buffer; NetHead->PKG_LEN=strlen(NetHead->data); NetHead->ERRNO2= PACK_CONTINUE; NetHead->O_NODE=LocalAddr(conn->Socket,0); ret=SendPack(conn,NetHead); *buffer=0; } NetHead->PROTO_NUM=PutEvent(conn,Event_no); NetHead->data=0; NetHead->PKG_LEN=0; NetHead->ERRNO2=0; NetHead->PKG_REC_NUM=0; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); free(buff); return 0; }