int SocketClient::read_bytes(char *buf, size_t len) { int num_read = read(sockfd, buf, len); if (num_read == -1) { perror("Error reading from socket"); throw SocketReadError(); } return num_read; }
int AuthClientUser::ClientProcessThread(SingleThread * self) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); int timeout = SOCKET_TIMEOUT; setsockopt(m_ClientSocket, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout)); vector<BYTE> output; //1. Auth if(!this->SocketReadBuff(sizeof(tagCClientAuth), &output)) { SocketReadError("tagCClientAuth SocketReadBuff Error"); return -1; } tagCClientAuth *clietAuth = (tagCClientAuth *)&output[0]; clietAuth->UserName[sizeof(clietAuth->UserName)-1] = '\0'; m_UserName = clietAuth->UserName; m_UserName = m_UserName.LowerCase(); m_UserName = m_UserName.Trim(); string input_username = clietAuth->UserName; SendLogMessage(FormatStr(GBText("用户[%s]开始验证..."), m_UserName)); m_Build = clietAuth->Build; BigNumber A, s, B, K, M2; A.SetBinary(clietAuth->A, sizeof(clietAuth->A)); m_IsChargeProcess = clietAuth->IsChargeProcess; if(!m_SRP6Server.CalcKey(input_username, input_username, A, &s, &B, &K)) { SendLogMessage("错误(1)"); SocketReadError("CalcKey Error"); return -1; } tagSClientAuth sendAuth; memcpy(sendAuth.s, s.AsByteArray(), sizeof(sendAuth.s)); memcpy(sendAuth.B, B.AsByteArray(), sizeof(sendAuth.B)); if(!this->SendAuthMessage((BYTE *)&sendAuth, sizeof(sendAuth))) { SocketReadError("tagSClientAuth SocketSend Error"); return -1; } //2. Auth Check if(!this->SocketReadBuff(sizeof(tagCAuthCheck), &output)) { SocketReadError("tagCAuthCheck SocketReadBuff Error"); return -1; } tagCAuthCheck *clientAuthCheck = (tagCAuthCheck *)&output[0]; if(!m_SRP6Server.CheckClientAuth(input_username, clientAuthCheck->M, &M2)) { SendLogMessage("错误(2)"); SocketReadError("Auth Check Error"); return -1; } tagSAuthCheck sendAuthCheck; memcpy(sendAuthCheck.M2, M2.AsByteArray(), sizeof(sendAuthCheck.M2)); if(!this->SendAuthMessage((BYTE *)&sendAuthCheck, sizeof(sendAuthCheck))) { SocketReadError("tagSAuthCheck SocketSend Error"); return -1; } m_AuthCrypt.Init(&K, WOWWGUserServerEncryptionKey, WOWWGUserServerDecryptionKey); vector<String> outputMsg; if(!CheckUserCanLogin(&outputMsg)) { for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } SocketReadError(FormatStr("[RefuseLogin]:%s", m_RefuseLoginReason)); return -1; } for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } // SendLogMessage(FormatStr(GBText("用户[%s]验证成功!"), m_UserName)); TDateTime expTime; if(m_IsChargeProcess) { //充值 BYTE len = 0; if(!this->SocketReadBYTE(&len)) { SendLogMessage("错误(17)"); SocketReadError("Charge CardNo Read Len Error"); return -1; } if(!this->SocketReadBuff(len, &output)) { SendLogMessage("错误(14)"); SocketReadError("Charge CardNo Read Error"); return -1; } AnsiString cardNo = AnsiString((char *)&output[0], len); cardNo = cardNo.Trim(); cardNo = cardNo.UpperCase(); outputMsg.clear(); if(!Charge(m_ADOQuery, m_UserName, cardNo, &outputMsg)) { for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } SocketReadError("Charge Fail!"); return -1; } for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } outputMsg.clear(); if(!GetExpireTime(m_ADOQuery, m_UserName, &outputMsg, &expTime)) { for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } SocketReadError("Charge GetExpireTime Fail!"); return -1; } for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } SendLogMessage(GBText("充值成功!")); } else { //验证 tagWOWAddrInfo addrInfo; if(!FindAddrInfo(m_Build, &addrInfo)) { SendLogMessage("错误(3)"); GetLog()->Error("No Build Msg. Build = %d", m_Build); SocketReadError("We Don't Have This Build!"); return -1; } outputMsg.clear(); if(!GetExpireTime(m_ADOQuery, m_UserName, &outputMsg, &expTime)) { for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } SocketReadError("GetExpireTime Fail!"); return -1; } for(DWORD i=0; i<outputMsg.size(); i++) { SendLogMessage(outputMsg[i]); } tagClientAddrInfo info; info.Address = addrInfo.Addr; info.Offset = addrInfo.Offset; info.ExpireTime = expTime; if(!this->SendAuthMessage((BYTE *)&info, sizeof(tagClientAddrInfo))) { SocketReadError("tagClientAddrInfo SocketSend Error"); return -1; } m_ADOQuery->SQL->Text = FormatStr("SELECT * FROM wow_msg where msg_key = '%s'", L"login"); if(OpenSQL(m_ADOQuery)) { if(m_ADOQuery->RecordCount) { m_ADOQuery->First(); String text = m_ADOQuery->FieldByName("msg")->AsString; SendLogMessage(text); } } SendLogMessage(GBText("验证成功!")); } SendLogMessage(GBText(FormatStr("你的帐号[%s]到期时间为:%s", m_UserName, DateTimeToStr(expTime)))); OnLoginSuccess(); Sleep(1000); this->SetIsClosed(1); return -1; }