void login_from_new_char() { Uint32 i; char ch; for(i=0;i<strlen(pass_str);i++) { ch=pass_str[i]; if(ch)password_str[i]=ch; else break; } password_str[i]=0; for(i=0;i<strlen(user_str);i++) { ch=user_str[i]; if(ch)username_str[i]=ch; else break; } username_str[i]=0; //now send the log in info send_login_info(); }
void connect_to_server() { IPaddress ip; if(this_version_is_invalid)return; if(set) { SDLNet_FreeSocketSet(set); set=0; } if(my_socket) { SDLNet_TCP_Close(my_socket); my_socket=0; } log_to_console(c_red1,connect_to_server_str); draw_scene(); // update the screen set=SDLNet_AllocSocketSet(1); if(!set) { char str[120]; sprintf(str,"SDLNet_AllocSocketSet: %s\n", SDLNet_GetError()); log_error(str); SDLNet_Quit(); SDL_Quit(); exit(4); //most of the time this is a major error, but do what you want. } if(SDLNet_ResolveHost(&ip,server_address,port)==-1) { log_to_console(c_red2,failed_resolve); return; } my_socket=SDLNet_TCP_Open(&ip); if(!my_socket) { //check to see if the player is a moron... if(server_address[0]=='1' && server_address[1]=='9' && server_address[2]=='2' && server_address[3]=='.' && server_address[4]=='1' && server_address[5]=='6' && server_address[6]=='8') { log_to_console(c_red1,license_check); log_to_console(c_red1,alt_x_quit); } else { log_to_console(c_red1,failed_connect); log_to_console(c_red1,reconnect_str); log_to_console(c_red1,alt_x_quit); } return; } if(SDLNet_TCP_AddSocket(set,my_socket)==-1) { char str[120]; sprintf(str,"SDLNet_TCP_AddSocket: %s\n",SDLNet_GetError()); log_error(str); SDLNet_Quit(); SDL_Quit(); exit(2); } disconnected=0; //ask for the opening screen if(!previously_logged_in) { Uint8 str[1]; str[0]=SEND_OPENING_SCREEN; my_tcp_send(my_socket,str,1); } else { yourself=-1; you_sit=0; destroy_all_actors(); send_login_info(); } //send the current version to the server send_version_to_server(&ip); last_heart_beat=cur_time; hide_window(trade_win); }
int loop_socket_handle(int socket, int tt_ms) { unsigned char outhexbuf[ONE_TCP_MAX_LEN] = {0}; PRO *pro = (PRO*)malloc(sizeof(PRO)); memset(pro, 0, sizeof(PRO)); pro->payload = (unsigned char*)malloc(ONLINE_MAX_LEN); memset(pro->payload, 0, (ONLINE_MAX_LEN)); int ret = 0; int login_ok = 0; unsigned int sendseq = 0; int outinx = 0; int hexlen = 0; MACH_STAT stat = IDLE; while(1) { debug(LOG_NOTICE, "stat=%d,login_flag=%d,outinx=%d,last_cmd=%04x,last_recv_ret=%d,dev_work_status=%d\n", stat,login_ok,outinx,pro->hd.cmd,ret,dev_work_status); switch(stat) { case IDLE: //sleep_intp_s(5); //will block tcp recving break; case TO_LOGIN: memset(&pro->hd, 0, sizeof(PRO_HD)); memset(pro->payload, 0, (ONLINE_MAX_LEN)); send_login_info(socket, pro, sendseq++); break; case TO_DEVSTATUS: //recv_uart(); //send_dev_data(); if(glb_cfg.glb_sock != socket) glb_cfg.glb_sock = socket; // uart thread will write glb_sock directly. break; case TO_WORKSTATUS: memset(pro->payload, 0, (ONLINE_MAX_LEN)); if(dev_work_status == E_DEV_TAKEUP) { send_busy_info(socket, pro, dev_work_status, sendseq++); } else { send_status_info(socket, pro, dev_work_status, sendseq++); } stat = IDLE; break; case TO_RESPSTATUS: memset(pro->payload, 0, (ONLINE_MAX_LEN)); response_status_info(socket, pro, dev_work_status, sendseq++); stat = IDLE; break; case TO_HEART: memset(&pro->hd, 0, sizeof(PRO_HD)); send_heart_info(socket, &pro->hd, sendseq++); if(outinx++ > HEART_EXIT_COUNT) goto EXIT_ERR; else stat = IDLE; break; case TO_RESP: //for testing;all back pro->hd.stat = PRO_RSP; memset(outhexbuf, 0, sizeof(outhexbuf)); hexlen = 0; pro_pro2hexbuf(pro,outhexbuf,&hexlen); send(socket, outhexbuf, hexlen, sendseq++); debug(LOG_DEBUG, "Send Resp Len:%d\n",hexlen); stat = IDLE; break; case NET_DISCONN: goto EXIT_ERR; break; default: break; } //memset(pro, 0, sizeof(PRO)); //NOTE***: will init payload as NULL; this will cause crash!!! memset(&pro->hd, 0, sizeof(PRO_HD)); memset(pro->payload, 0, (ONLINE_MAX_LEN)); ret = socket_recv_tt(socket, pro, tt_ms); if(ret == 0) { // timeout if(!login_ok) { stat = TO_LOGIN; } else { stat = TO_HEART; } } else if(ret < 0) { // socket error goto EXIT_ERR; } else if( (ret != sizeof(PRO_HD)) && (ret != sizeof(PRO_HD)+pro->hd.len) ) { debug(LOG_NOTICE, "Recv Length %d Error!\n",ret); continue; } else { // handle data... switch(pro->hd.cmd) { case IDM_DEV_LOGIN: debug(LOG_NOTICE, "---< server back: login\n"); login_ok = 1; if(dev_work_status != E_DEV_TAKEUP) dev_work_status = E_DEV_ONLINE; stat = TO_DEVSTATUS; break; case IDM_DEV_HEART: debug(LOG_NOTICE, "---< server back: heart\n"); outinx = 0; break; case IDM_GETDEV: debug(LOG_NOTICE, "---< server cmd: get dev\n"); stat = TO_RESPSTATUS; break; /* for response testing */ case 0xfffe: debug(LOG_NOTICE, "---< server cmd: test response\n"); stat = TO_RESP; break; case IDM_TAKEUPDEV: case IDM_RELEASEDEV: case IDM_RESET: case IDM_DOSTART: case IDM_DOSTOP: case IDM_SETPARS: case IDM_DELPARS: if(0 == memcmp(taskid, pro->payload+32, 32)) { break; } else { if(dev_work_status == E_DEV_TAKEUP) { debug(LOG_WARNING, "---< server taskid is not correct!\n"); stat = TO_WORKSTATUS; continue; } else { /* Firstly takeup device */ break; } } default: debug(LOG_ERR, "==== Handle: Unknow Server CMD 0x%02x\n", pro->hd.cmd); continue; } switch(pro->hd.cmd) { /* handle at local */ case IDM_TAKEUPDEV: debug(LOG_NOTICE, "---< server cmd: takeup dev\n"); dev_work_status = E_DEV_TAKEUP; stat = TO_WORKSTATUS; memcpy(taskid, pro->payload+32, sizeof(taskid)); /* skip devid 32*/ break; case IDM_RELEASEDEV: debug(LOG_NOTICE, "---< server cmd: release dev\n"); dev_work_status = E_DEV_ONLINE; stat = TO_WORKSTATUS; memset(taskid, 0, sizeof(taskid)); break; /* send to uart */ case IDM_RESET: debug(LOG_NOTICE, "---< server cmd: reset dev\n"); dev_work_status = E_DEV_ONLINE; stat = TO_WORKSTATUS; /* stop and clear */ dev_reset(pro->payload, pro->hd.len); break; case IDM_DOSTART: debug(LOG_NOTICE, "---< server cmd: start dev\n"); glb_cfg.rsp_cmd_type = SVR_NEED_TASK_RET; glb_cfg.rsp_cmd_type |= SVR_NEED_TASK_PERCT; /* only send payload to uart */ ret = dev_start(pro->payload, pro->hd.len); debug(LOG_DEBUG, "---Send To Com ret %d\n",ret); break; case IDM_DOSTOP: debug(LOG_NOTICE, "---< server cmd: stop dev\n"); glb_cfg.rsp_cmd_type = SVR_NEED_TASK_RET; /* only send payload to uart */ ret = dev_stop(pro->payload, pro->hd.len); debug(LOG_DEBUG, "---Send To Com ret %d\n",ret); break; case IDM_SETPARS: debug(LOG_NOTICE, "---< server cmd: set params dev\n"); /* only send params to uart */ ret = dev_setpar(pro->payload+64+2, (pro->hd.len-66)>0?(pro->hd.len-66):0); debug(LOG_DEBUG, "---Send To Com ret %d\n",ret); break; case IDM_DELPARS: debug(LOG_NOTICE, "---< server cmd: del params\n"); /* only send payload to uart */ ret = dev_clrpar(pro->payload, pro->hd.len); debug(LOG_DEBUG, "---Send To Com ret %d\n",ret); break; } } continue; } /* end while(1) */ EXIT_ERR: debug(LOG_NOTICE, "<--- Socket recv out!\n"); glb_cfg.glb_sock = -1; glb_cfg.rsp_cmd_type = 0; if(socket > 0) close(socket); if(pro && pro->payload) { free(pro->payload); free(pro); } return -1; }