Example #1
0
int GDCT_Transfer::do_send_heartbeat()
{
	ACE_ASSERT(is_connected_ == 1);
	gdct_msg_t mymsg,recvmsg;
	ACE_OS::memset(&mymsg,0,sizeof mymsg);
	ACE_OS::memset(&recvmsg,0,sizeof recvmsg);
	ACE_OS::strcpy(mymsg.msgcode,"000119");
	ACE_OS::strcpy(mymsg.msgtype,gdct_msgtype_);
	mymsg.bodylen = 0;
	
	if(do_send_and_recv(&mymsg,&recvmsg)!=0)
	{
		ACE_DEBUG((LM_ERROR,"向讯源服务器[发送心跳]失败"));
		do_disconnect();
		return -1;
	}
	if(ACE_OS::strncmp(recvmsg.msgcode,"800119",6)!=0)
	{
		ACE_DEBUG((LM_ERROR,"向讯源服务器[发送心跳]失败,接收错误数据包"));
		do_disconnect();
		return -1;
	}
	ACE_DEBUG((LM_DEBUG,"讯源服务器[发送心跳]成功!"));
	last_success_time_ = ACE_OS::gettimeofday();
	return 0;
}
Example #2
0
int GDCT_Transfer::do_logout_svr()
{
	ACE_ASSERT(is_connected_ == 1);
	gdct_msg_t mymsg,recvmsg;
	ACE_OS::memset(&mymsg,0,sizeof mymsg);
	ACE_OS::memset(&recvmsg,0,sizeof recvmsg);
	ACE_OS::strcpy(mymsg.msgcode,"000002");
	ACE_OS::strcpy(mymsg.msgtype,gdct_msgtype_);
	mymsg.bodylen = 0;
	if(do_send_and_recv(&mymsg,&recvmsg)!=0)
	{
		ACE_DEBUG((LM_ERROR,"向讯源服务器[注销]失败"));
		return -1;
	}
	ACE_DEBUG((LM_INFO,"讯源服务器[注销]成功!"));
	return 0;
}
Example #3
0
int GDCT_Transfer::do_login_svr()
{
	ACE_ASSERT(is_connected_ == 1);
	gdct_msg_t mymsg,recvmsg;
	ACE_OS::memset(&mymsg,0,sizeof mymsg);
	ACE_OS::memset(&recvmsg,0,sizeof recvmsg);
	ACE_OS::strcpy(mymsg.msgcode,"000001");
	ACE_OS::strcpy(mymsg.msgtype,gdct_msgtype_);
	// 运营商
	ACE_OS::strcpy(mymsg.body,"00000000");
	mymsg.bodylen=8;
	// 企业代码
	ACE_OS::strcpy(mymsg.body+mymsg.bodylen,gdct_company_code_);
	mymsg.bodylen+=8;
	// 企业密码
	ACE_OS::strcpy(mymsg.body+mymsg.bodylen,gdct_company_pswd_);
	mymsg.bodylen+=32;
	// 协议版本
	ACE_OS::strcpy(mymsg.body+mymsg.bodylen,"0010");
	mymsg.bodylen+=4;
	if(do_send_and_recv(&mymsg,&recvmsg)!=0)
	{
		ACE_DEBUG((LM_ERROR,"向讯源服务器[登录]失败"));
		return -1;
	}
	if(ACE_OS::strncmp(recvmsg.msgcode,"800001",6)!=0)
	{
		ACE_DEBUG((LM_ERROR,"[登录]错误,接收数据包实际类容为[%s]",recvmsg.msgcode));
		return -1;
	}
	if(ACE_OS::strncmp(recvmsg.respcode,"0000",4)!=0)
	{
		ACE_DEBUG((LM_ERROR,"讯源服务器[登录]失败,错误码[%s]",recvmsg.respcode));
		return -1;
	}
	ACE_DEBUG((LM_INFO,"[登录]讯源服务器成功!"));
	last_success_time_ = ACE_OS::gettimeofday();
	return 0;
}
Example #4
0
/* daemon thread, to take full control of a device. */
void *device_daemon(void *pdata)
{
	pthread_t startup_thread;
	MODAT *p = (MODAT *) pdata;
	dbg(1, "daemon for %s started.", p->name);
	int retval;

	/* daemon main process */
	while (1) {
		switch (modat_get_status(p)) {
		case INIT:
			if (modat_get_enable(p))
				do_init_work(p);
			break;
		case STARTUP:
			/* some specified startup steps */
			switch (p->start_up_status) {
			case NOT_STARTUP:
				/* create the start_up thread */
				dbg(1,
				    "starting startup_thread with DETACHED.");
				retval =
				    pthread_create(&startup_thread, NULL,
						   &do_startup_work, (void *)p);
				retval |= pthread_detach(startup_thread);
				if (!retval) {
					dbg(1,
					    "started startup_thread successfully");
					p->start_up_status = INIT_STARTUP;
				} else {
					dbg(1, "retval=%d, errno=%d, errstr=%s",
					    retval, errno, strerror(errno));
					dbg(1,
					    "failed to create startup_thread: %s",
					    strerror(retval));
					p->start_up_status = FAILED_STARTUP;
				}
				break;
			case INIT_STARTUP:
				/* do nothing */
				break;
			case DURING_STARTUP:
				/* the thread is start! waiting result. */
				break;
			case OK_STARTUP:
				/* startup done successfully */
				dbg(1,
				    "startup successfully, setting status to READY.");
				modat_set_status(p, READY);
				break;
			case FAILED_STARTUP:
				/* startup failed */
				dbg(1,
				    "startup failed, setting status to DEAD.");
				modat_set_status(p, DEAD);
				break;
			default:
				dbg(1, "start_up_status=%d, out of control.",
				    p->start_up_status);
				break;
			}
			do_send_and_recv(p);
			break;
		case READY:
		case WORKING:
			do_send_and_recv(p);
			/* do send and recv */
			break;
		case NOT_RESPONDING:
			modat_set_status(p, WAIT_USERS);
			break;
		case UNTACHED:
			dbg(1, "UNTACHED ?! Roger ! now there are %d users"
			    " accessing the modem.", p->users_count);
			modat_set_status(p, WAIT_USERS);
			break;
		case WAIT_USERS:
			if (p->users_count == 0) {
				dbg(1, "all users acknowledged. marking DEAD.");
				modat_set_status(p, DEAD);
			}
			break;
		case DEAD:
			dbg(1, "Hi, I am DEAD ... quitting thread now.");
			pthread_exit(NULL);
			break;
		default:
			dbg(1, "VITAL ERROR! p->type[%d] not known.", p->type);
			pthread_exit(NULL);
			break;
		}
		usleep(200000);
	}

	return (void *)0;
}