Example #1
0
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;
}
Example #2
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;
}
Example #3
0
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;
}
Example #4
0
/* 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;
}