UINT ThreadFunc(LPVOID ThreadArg) { int nBreathStep = 0; unsigned long ul = 1; Sleep(WAITFORMAIN_TIME); CTaoFlowDlg *pDlg = (CTaoFlowDlg *)ThreadArg; pDlg->m_Sock.InitSock(); ConnectToServer: int sock = pDlg->m_Sock.ConnectTo(DEFAULT_SERVER_PORT, "192.168.1.2"); if (sock <= 0) { pDlg->m_stcDycInfo.SetWindowTextW(_T("连接服务器失败,正在重试")); Sleep(RECONNECT_SERVER); goto ConnectToServer; } ioctlsocket(sock, FIONBIO, (unsigned long *)&ul); LoginToServer: //发登录包 PackHead_T head; head.ePType = LoginReq; head.eCType = FlowClient; LogCli_T body; CString strSerial = GetSerialNum(); CString2Char(strSerial, body.MachCode); body.nSecretCode = SECRET_CODE; head.nBodySize = sizeof(LogCli_T); int flag = sizeof(PackHead_T) + sizeof(LogCli_T); std::string str; str.resize(flag + PACKSIZE_FLAG); memcpy((void *)(str.data()), &flag, PACKSIZE_FLAG); memcpy((void *)(str.data() + PACKSIZE_FLAG), &head, sizeof(head)); memcpy((void *)(str.data() + PACKSIZE_FLAG + sizeof(head)), &body, sizeof(body)); int n = send(sock, str.data(), flag + PACKSIZE_FLAG, 0); if (n >= flag + PACKSIZE_FLAG) { while (1) { str.resize(BUFFERSIZE); n = recv(sock, (char *)str.data(), BUFFERSIZE, 0); if (n >= PACKHEAD_SIZE) { PackHead_T head; memcpy(&head, (void *)(str.data() + PACKSIZE_FLAG), PACKHEAD_SIZE); if (head.ePType == BreathRes) { //重置掉线超时计数器 g_nTimeout = TIMEOUT_COUNT; } else { int flagsize; memcpy(&flagsize, (void *)str.data(), PACKSIZE_FLAG); if (n >= flagsize) { switch (head.ePType) { case LoginRes: LogSer_T body; memcpy(&body, (void *)(str.data() + PACKSIZE_FLAG + PACKHEAD_SIZE), sizeof(LogSer_T)); if (body.bOk) { pDlg->m_stcDycInfo.SetWindowTextW(_T("已成功连接至流量王服务器")); } else { Sleep(RECONNECT_SERVER); goto LoginToServer; } break; case TaskRes: break; } } } } //发心跳包 nBreathStep++; if (nBreathStep > 30) { PackHead_T head; head.ePType = BreathReq; head.eCType = FlowClient; head.nBodySize = 0; int flag = PACKHEAD_SIZE; str.resize(flag + PACKSIZE_FLAG); memcpy((void *)(str.data()), &flag, PACKSIZE_FLAG); memcpy((void *)(str.data() + PACKSIZE_FLAG), &head, sizeof(head)); n = send(sock, str.data(), flag + PACKSIZE_FLAG, 0); nBreathStep = 0; } Sleep(READ_TIME_STEP); //超时计数器 g_nTimeout--; if (g_nTimeout <= 0) { pDlg->m_stcDycInfo.SetWindowTextW(_T("从服务器的连接已断开,请检查网络")); closesocket(sock); goto ConnectToServer; } } } else { closesocket(sock); goto LoginToServer; } closesocket(sock); WSACleanup(); return 0; }
void main(void) { register int j; char name[31]; /* user name */ char num[12]; /* serial number string for f f */ char cnum[12]; /* check sum string for fake file */ char final[35]; /* final form of info to go to playgame */ combination comb; char doover=0; /* re-get serial number if entered wrong */ unsigned long int checksum; /* name/number verification number */ FILE *fp; char done=0,skip=0; char drive; char fname[30]; unsigned long int first=0,second=0,third=0; getdate(&Date); do { do { doover=0; clrscr(); gotoxy(13, 9); printf("������������������������ͻ"); gotoxy(13,10); printf("� GM V"GMVER" Registration �"); gotoxy(13,11); printf("������������������������"); gotoxy(13,12); printf("�Disk a,b, or b(o)th: �"); gotoxy(13,13); printf("������������������������ͼ"); drive = getch(); switch (drive) { case 'o': case 'O': drive='O'; case 'a': case 'A': case 'b': case 'B': break; case 13: case 27: done=1; break; default : doover=1; break; } } while ( (done==0) && (doover==1) ); if (!done) { int i=0; num[0]=0; gotoxy(13,11); printf("������������������������ͼ"); gotoxy(13,12); printf("���������������������������������������������������ͻ"); gotoxy(13,13); printf("�Enter customer name: �"); gotoxy(13,14); printf("���������������������������������������������������ͼ"); gotoxy(35,13); for (i=0;i<31;i++) name[i]=0; // Initialize name gets(name); if (name[0]==0) skip = 1; else { j=0; while (name[j]!=0) j++; while (j<30) { name[j]=0; j++; } } } if (!done) { if (drive=='O') done=!(GetSerialNum(&comb.ser,'A')); else done=!(GetSerialNum(&comb.ser,drive)); sprintf(num,"%lu",comb.ser); printf("\n\nSerial Number:%s\n",num); } if (!done) { if (!skip) { first=0; second=0; third=0; for (j=0;j<7;j++) first +=(name[j]&255); for (j=7;j<18;j++) second+=(name[j]&255); for (j=18;j<30;j++) third+=(name[j]&255); checksum = (comb.ser*first) + (second*1143) + (third ^ 0x16AC); } else checksum = ((unsigned long) rand() + ((unsigned long)rand() * 237)); sprintf(cnum,"%lu",checksum); // Write Registration info if (drive=='O') { done = !(WriteReg(name,num,cnum,'a')); if (!done) done = !(WriteReg(name,num,cnum,'b')); } else done = !(WriteReg(name,num,cnum,drive)); } if (!done) // Write to Playgame and Xferplay { final[0]='�'; if (skip) for (j=1;j<29;j++) final[j]=j+64; else for (j=1;j<29;j++) final[j]=(21+name[j-1]+5*j); final[29]=0; final[30]=comb.ord.fir;