void download_p2p(int sockfd){ int count; char bufferFST[4]; count = recv(sockfd, bufferFST, 4, MSG_PEEK); if(count == -1) perror("Recv with error"); google::protobuf::uint32 pkg_size = readHdr(bufferFST); int byteCount; file::File request_file; char buffer[pkg_size + HDR_SIZE]; if( ( byteCount = recv(sockfd, (void *)buffer, pkg_size + HDR_SIZE, MSG_WAITALL) ) == -1 ){ perror("Error recviving data"); } google::protobuf::io::ArrayInputStream ais(buffer, pkg_size + HDR_SIZE); google::protobuf::io::CodedInputStream coded_input(&ais); coded_input.ReadVarint32(&pkg_size); google::protobuf::io::CodedInputStream::Limit msgLimit = coded_input.PushLimit(pkg_size); request_file.ParseFromCodedStream(&coded_input); for(auto it=file_sets.begin(); it!=file_sets.end(); ++it){ if( it-> first == request_file.file_name() && !it->second.empty() ){ sendCheck(sockfd, true); send_download_info(sockfd, it->second); return; } } sendCheck(sockfd, false); return; }
void delete_account(int sockfd){ int count; char bufferFST[4]; count = recv(sockfd, bufferFST, 4, MSG_PEEK); if(count == -1) perror("Recv with error"); login::DeleteInfo info = readDeleteInfo(sockfd, readHdr(bufferFST) ); std::cout << info.DebugString(); Data::Data newInfo; newInfo.set_id( info.id() ); newInfo.set_password( info.passwd() ); for(int i=0; i<loginData.logindata_size(); ++i){ if( loginData.logindata(i).id() == newInfo.id() && loginData.logindata(i).password() == newInfo.password() ){ loginData.mutable_logindata(i)->set_id(""); loginData.mutable_logindata(i)->set_password(""); loginData.mutable_logindata(i)->set_online(false); sendCheck(sockfd, true); update(); } } sendCheck(sockfd, false); return; }
void logout(int sockfd, std::map<std::string, std::set<std::string> > &file_sets){ //recv logout info int count; char bufferFST[4]; count = recv(sockfd, bufferFST, 4, MSG_PEEK); if(count == -1) perror("Recv with error"); login::Login login = readLogin(sockfd, readHdr(bufferFST) ); //std::cout << login.DebugString(); //check id and password Data::Data newLogin; newLogin.set_id( login.id() ); newLogin.set_password( login.passwd() ); for(int i=0; i<loginData.logindata_size(); ++i){ if( loginData.logindata(i).id() == newLogin.id() && loginData.logindata(i).password() == newLogin.password() ){ sendCheck(sockfd, true); tm* ptr_now; time_t loc_now = 0; time(&loc_now); std::string id = loginData.logindata(i).id(); loginData.mutable_logindata(i)->set_online(false); ptr_now = localtime(&loc_now); printf("%s[%d:%d:%d] : [%s] logout %s\n", ANSI_COLOR_RED , ptr_now->tm_hour, ptr_now->tm_min, ptr_now->tm_sec, id.c_str(), ANSI_COLOR_RESET); logout_update(sockfd, file_sets, login.id()); return; } } return; }
void regist_check(int sockfd){ //recv regist int count; char bufferFST[4]; count = recv(sockfd, bufferFST, 4, MSG_PEEK); if(count == -1) perror("Recv with error"); google::protobuf::uint32 size = readHdr(bufferFST); int byteCount; regist::Regist regist; char buffer[size + HDR_SIZE]; if( ( byteCount = recv(sockfd, (void *)buffer, size + HDR_SIZE, MSG_WAITALL) ) == -1 ){ perror("Error recviving data"); } google::protobuf::io::ArrayInputStream ais(buffer, size + HDR_SIZE); google::protobuf::io::CodedInputStream coded_input(&ais); coded_input.ReadVarint32(&size); google::protobuf::io::CodedInputStream::Limit msgLimit = coded_input.PushLimit(size); regist.ParseFromCodedStream(&coded_input); coded_input.PopLimit(msgLimit); //std::cout << regist.DebugString(); //check id and password Data::Data newRegist; newRegist.set_id( regist.id() ); newRegist.set_password( regist.passwd() ); for(int i=0; i<loginData.logindata_size(); ++i){ if( loginData.logindata(i).id() == newRegist.id() ){ sendCheck(sockfd, false); return; } } Data::Data* data = loginData.add_logindata(); data -> set_id(regist.id()); data -> set_password(regist.passwd()); update(); sendCheck(sockfd, true); }
void chat(int sockfd){ // recv name int count; char bufferFST[4]; count = recv(sockfd, bufferFST, 4, MSG_PEEK); if(count == -1) perror("Recv with error"); google::protobuf::uint32 pkg_size = readHdr(bufferFST); int byteCount; online::OnlinePerson person; char buffer[pkg_size + HDR_SIZE]; if( ( byteCount = recv(sockfd, (void *)buffer, pkg_size + HDR_SIZE, MSG_WAITALL) ) == -1 ){ perror("Error recviving data"); } google::protobuf::io::ArrayInputStream ais(buffer, pkg_size + HDR_SIZE); google::protobuf::io::CodedInputStream coded_input(&ais); coded_input.ReadVarint32(&pkg_size); google::protobuf::io::CodedInputStream::Limit msgLimit = coded_input.PushLimit(pkg_size); person.ParseFromCodedStream(&coded_input); // check whether online for(int i=0; i<loginData.logindata_size(); ++i){ if( loginData.logindata(i).online() == true ){ if( loginData.logindata(i).id() != "" && loginData.logindata(i).id() == person.name() ){ sendCheck(sockfd, true); send_port(sockfd, loginData.logindata(i).port(), loginData.logindata(i).ip()); return; } } } sendCheck(sockfd, false); printf("!ok\n"); }
static void gameStateUpdate() { // Can't dump isHumanPlayer, since it causes spurious desynch dumps when players leave. // TODO isHumanPlayer should probably be synchronised, since the game state seems to depend on it, so there might also be a risk of real desynchs when players leave. //syncDebug("map = \"%s\", humanPlayers = %d %d %d %d %d %d %d %d", game.map, isHumanPlayer(0), isHumanPlayer(1), isHumanPlayer(2), isHumanPlayer(3), isHumanPlayer(4), isHumanPlayer(5), isHumanPlayer(6), isHumanPlayer(7)); syncDebug("map = \"%s\"", game.map); // Actually send pending droid orders. sendQueuedDroidInfo(); sendPlayerGameTime(); gameSRand(gameTime); // Brute force way of synchronising the random number generator, which can't go out of synch. if (!paused && !scriptPaused() && !editPaused()) { /* Update the event system */ if (!bInTutorial) { eventProcessTriggers(gameTime/SCR_TICKRATE); } else { eventProcessTriggers(realTime/SCR_TICKRATE); } updateScripts(); } // Update abandoned structures handleAbandonedStructures(); // Update the visibility change stuff visUpdateLevel(); // Put all droids/structures/features into the grid. gridReset(); // Check which objects are visible. processVisibility(); // Update the map. mapUpdate(); //update the findpath system fpathUpdate(); // update the cluster system clusterUpdate(); // update the command droids cmdDroidUpdate(); if(getDrivingStatus()) { driveUpdate(); } fireWaitingCallbacks(); //Now is the good time to fire waiting callbacks (since interpreter is off now) for (unsigned i = 0; i < MAX_PLAYERS; i++) { //update the current power available for a player updatePlayerPower(i); //set the flag for each player setHQExists(false, i); setSatUplinkExists(false, i); numCommandDroids[i] = 0; numConstructorDroids[i] = 0; numDroids[i]=0; numTransporterDroids[i]=0; DROID *psNext; for (DROID *psCurr = apsDroidLists[i]; psCurr != NULL; psCurr = psNext) { // Copy the next pointer - not 100% sure if the droid could get destroyed but this covers us anyway psNext = psCurr->psNext; droidUpdate(psCurr); // update the droid counts numDroids[i]++; switch (psCurr->droidType) { case DROID_COMMAND: numCommandDroids[i] += 1; break; case DROID_CONSTRUCT: case DROID_CYBORG_CONSTRUCT: numConstructorDroids[i] += 1; break; case DROID_TRANSPORTER: if( (psCurr->psGroup != NULL) ) { DROID *psDroid = NULL; numTransporterDroids[i] += psCurr->psGroup->refCount-1; // and count the units inside it... for (psDroid = psCurr->psGroup->psList; psDroid != NULL && psDroid != psCurr; psDroid = psDroid->psGrpNext) { if (psDroid->droidType == DROID_CYBORG_CONSTRUCT || psDroid->droidType == DROID_CONSTRUCT) { numConstructorDroids[i] += 1; } if (psDroid->droidType == DROID_COMMAND) { numCommandDroids[i] += 1; } } } break; default: break; } } numMissionDroids[i]=0; for (DROID *psCurr = mission.apsDroidLists[i]; psCurr != NULL; psCurr = psNext) { /* Copy the next pointer - not 100% sure if the droid could get destroyed but this covers us anyway */ psNext = psCurr->psNext; missionDroidUpdate(psCurr); numMissionDroids[i]++; switch (psCurr->droidType) { case DROID_COMMAND: numCommandDroids[i] += 1; break; case DROID_CONSTRUCT: case DROID_CYBORG_CONSTRUCT: numConstructorDroids[i] += 1; break; case DROID_TRANSPORTER: if( (psCurr->psGroup != NULL) ) { numTransporterDroids[i] += psCurr->psGroup->refCount-1; } break; default: break; } } for (DROID *psCurr = apsLimboDroids[i]; psCurr != NULL; psCurr = psNext) { /* Copy the next pointer - not 100% sure if the droid could get destroyed but this covers us anyway */ psNext = psCurr->psNext; // count the type of units switch (psCurr->droidType) { case DROID_COMMAND: numCommandDroids[i] += 1; break; case DROID_CONSTRUCT: case DROID_CYBORG_CONSTRUCT: numConstructorDroids[i] += 1; break; default: break; } } // FIXME: These for-loops are code duplicationo /*set this up AFTER droidUpdate so that if trying to building a new one, we know whether one exists already*/ setLasSatExists(false, i); STRUCTURE *psNBuilding; for (STRUCTURE *psCBuilding = apsStructLists[i]; psCBuilding != NULL; psCBuilding = psNBuilding) { /* Copy the next pointer - not 100% sure if the structure could get destroyed but this covers us anyway */ psNBuilding = psCBuilding->psNext; structureUpdate(psCBuilding, false); //set animation flag if (psCBuilding->pStructureType->type == REF_HQ && psCBuilding->status == SS_BUILT) { setHQExists(true, i); } if (psCBuilding->pStructureType->type == REF_SAT_UPLINK && psCBuilding->status == SS_BUILT) { setSatUplinkExists(true, i); } //don't wait for the Las Sat to be built - can't build another if one is partially built if (asWeaponStats[psCBuilding->asWeaps[0].nStat]. weaponSubClass == WSC_LAS_SAT) { setLasSatExists(true, i); } } for (STRUCTURE *psCBuilding = mission.apsStructLists[i]; psCBuilding != NULL; psCBuilding = psNBuilding) { /* Copy the next pointer - not 100% sure if the structure could get destroyed but this covers us anyway. It shouldn't do since its not even on the map!*/ psNBuilding = psCBuilding->psNext; structureUpdate(psCBuilding, true); // update for mission if (psCBuilding->pStructureType->type == REF_HQ && psCBuilding->status == SS_BUILT) { setHQExists(true, i); } if (psCBuilding->pStructureType->type == REF_SAT_UPLINK && psCBuilding->status == SS_BUILT) { setSatUplinkExists(true, i); } //don't wait for the Las Sat to be built - can't build another if one is partially built if (asWeaponStats[psCBuilding->asWeaps[0].nStat]. weaponSubClass == WSC_LAS_SAT) { setLasSatExists(true, i); } } } missionTimerUpdate(); proj_UpdateAll(); FEATURE *psNFeat; for (FEATURE *psCFeat = apsFeatureLists[0]; psCFeat; psCFeat = psNFeat) { psNFeat = psCFeat->psNext; featureUpdate(psCFeat); } objmemUpdate(); // Do completely useless stuff. if (!isInSync()) { sendCheck(); // send some pointless checking info if we're doomed anyway } // Must end update, since we may or may not have ticked, and some message queue processing code may vary depending on whether it's in an update. gameTimeUpdateEnd(); }