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; }
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; }
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; }
/* 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; }