int main(int argc, char **argv) { Aria::init(); ArClientBase client; std::string host; ArArgumentParser parser(&argc, argv); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); /* Check for -help, and unhandled arguments: */ if (!clientConnector.parseArgs() || !parser.checkHelpAndWarnUnparsed()) { clientConnector.logOptions(); exit(0); } /* Connect our client object to the remote server: */ if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server rejected connection, exiting\n"); else printf("Could not connect to server, exiting\n"); exit(1); } client.addHandler("getCameraModeListCam1", new ArGlobalFunctor1<ArNetPacket *>(&getCameraModeList)); client.requestOnce("getCameraModeListCam1"); ArNetPacket sending; // This does the look at goal mode sending.empty(); sending.strToBuf("lookAtGoal"); client.requestOnce("setCameraModeCam1", &sending); // This does the look at point mode (at 0 0); sending.empty(); sending.strToBuf("lookAtPoint"); sending.byte4ToBuf(1157); sending.byte4ToBuf(-15786); client.requestOnce("setCameraModeCam1", &sending); while (Aria::getRunning() && client.isConnected()) { client.loopOnce(); ArUtil::sleep(1000); } Aria::shutdown(); return 0; };
bool PtzCameraExample::init() { // If the server has the "getCameraList" request, then it's using // ArServerHandlerCameraCollection, and migth have multiple PTZs/cameras each with // its own set of requests. So send a "getCameraList" request, and when its // reply is received, the handler will send "getCameraInfo" requests for each. // If the server does not have "getCameraList", it only has one PTZ camera, just // send "getCameraInfo". The handler for that will send various control // commands. // If the server does not have "getCameraInfo", then it doesn't provide any // access to PTZ cameras. if(myClient->dataExists("getCameraList")) { ArLog::log(ArLog::Normal, "Server may have multiple cameras. Requesting list."); myClient->addHandler("getCameraList", &myCameraListReplyFunc); myClient->requestOnce("getCameraList"); } else if(myClient->dataExists("getCameraInfo")) { ArLog::log(ArLog::Normal, "Server does not support multiple cameras. Requesting info for its camera."); ArClientHandlerCamera *camClient = new ArClientHandlerCamera(myClient, ""); camClient->requestUpdates(100); mutex.lock(); myCameras.insert(camClient); mutex.unlock(); } else { ArLog::log(ArLog::Terse, "Error, server does not have any camera control requests. (Was the server run with video features enabled or video forwarding active?)"); return false; } return true; }
void drawing(ArNetPacket *packet) { int numDrawings; int i; char name[512]; char shape[512]; long primary, size, layer, secondary; unsigned long refresh; numDrawings = packet->bufToByte4(); ArLog::log(ArLog::Normal, "There are %d drawings", numDrawings); for (i = 0; i < numDrawings; i++) { packet->bufToStr(name, sizeof(name)); packet->bufToStr(shape, sizeof(shape)); primary = packet->bufToByte4(); size = packet->bufToByte4(); layer = packet->bufToByte4(); refresh = packet->bufToByte4(); secondary = packet->bufToByte4(); ArLog::log(ArLog::Normal, "name %-20s shape %-20s", name, shape); ArLog::log(ArLog::Normal, "\tprimary %08x size %2d layer %2d refresh %4u secondary %08x", primary, size, layer, refresh, secondary); client.addHandler(name, &drawingDataCB); client.request(name, refresh); } }
ArClientHandlerCamera(ArClientBase *client, const char *cameraName) : name(cameraName), myClient(client), request(client, cameraName) , myCameraInfoReplyFunc(this, &ArClientHandlerCamera::handleCameraInfoReply), myCameraDataReplyFunc(this, &ArClientHandlerCamera::handleCameraDataReply) { myClient->addHandler((std::string("getCameraInfo")+name).c_str(), &myCameraInfoReplyFunc); myClient->addHandler((std::string("getCameraData")+name).c_str(), &myCameraDataReplyFunc); }
int main(int argc, char **argv) { ArClientBase client; ArGlobalFunctor1<ArNetPacket *> testCB(&test); Aria::init(); //ArLog::init(ArLog::StdOut, ArLog::Verbose); ArTime startTime; startTime.setToNow(); if (!client.blockingConnect("localhost", 7273)) { printf("Could not connect to server, exiting\n"); exit(1); } printf("Took %ld msec to connect\n", startTime.mSecSince()); client.runAsync(); client.lock(); client.addHandler("test", &testCB); client.addHandler("test2", &testCB); client.addHandler("test3", &testCB); client.logDataList(); client.requestOnce("test"); client.request("test2", 100); client.request("test3", -1); client.unlock(); ArUtil::sleep(1000); printf("Changing speed\n"); client.lock(); client.request("test2", 300); client.unlock(); ArUtil::sleep(1000); client.lock(); client.requestStop("test2"); client.unlock(); ArUtil::sleep(1000); client.lock(); client.disconnect(); client.unlock(); ArUtil::sleep(50); exit(0); }
int main(int argc, char **argv) { Aria::init(); ArLog::init(ArLog::StdOut, ArLog::Normal); ArClientBase client; ArArgumentParser parser(&argc, argv); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); if (!clientConnector.parseArgs() || !parser.checkHelpAndWarnUnparsed()) { clientConnector.logOptions(); exit(0); } if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server '%s' rejected connection, exiting\n", client.getHost()); else printf("Could not connect to server '%s', exiting\n", client.getHost()); exit(1); } ArGlobalFunctor1<ArNetPacket *> getModeDataListCB(&getModeDataList); ArGlobalFunctor1<ArNetPacket *> getModeInfoCB(&getModeInfo); client.addHandler("getModeDataList", &getModeDataListCB); client.requestOnce("getModeDataList"); client.addHandler("getModeInfo", &getModeInfoCB); client.request("getModeInfo", -1); client.runAsync(); while (client.getRunningWithLock()) { ArUtil::sleep(1); //printf("%d ms since last data\n", client.getLastPacketReceived().mSecSince()); } Aria::shutdown(); return 0; }
int main(int argc, char **argv) { Aria::init(); ArGlobalFunctor1<ArNetPacket *> clientListHandlerCB(&clientListHandler); ArGlobalFunctor1<ArNetPacket *> clientAddedHandlerCB(&clientAddedHandler); ArGlobalFunctor1<ArNetPacket *> clientRemovedHandlerCB(&clientRemovedHandler); ArNetPacket packet; ArClientBase client; ArArgumentParser parser(&argc, argv); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed()) { Aria::logOptions(); exit(0); } if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server '%s' rejected connection, exiting\n", client.getHost()); else printf("Could not connect to server '%s', exiting\n", client.getHost()); exit(1); } printf("Connected to server.\n"); client.addHandler("clientList", &clientListHandlerCB); client.requestOnce("clientList"); client.addHandler("clientRemoved", &clientRemovedHandlerCB); client.request("clientRemoved", -1); client.addHandler("clientAdded", &clientAddedHandlerCB); client.request("clientAdded", -1); client.run(); Aria::shutdown(); return 0; }
int main(int argc, char **argv) { ArGlobalFunctor1<ArNetPacket *> getMapNameCB(handleGetMapName); ArGlobalFunctor1<ArNetPacket *> getMapCB(handleGetMap); Aria::init(); //ArLog::init(ArLog::StdOut, ArLog::Verbose); ArArgumentParser parser(&argc, argv); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); /* Check for -help, and unhandled arguments: */ if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed()) { Aria::logOptions(); exit(0); } /* Connect our client object to the remote server: */ if (!clientConnector.connectClient(&client)) { exit(1); } client.addHandler("getMap", &getMapCB); client.addHandler("getMapName", &getMapNameCB); client.requestOnce("getMapName"); start.setToNow(); client.requestOnce("getMap"); client.run(); }
int main(int argc, char **argv) { std::string hostname; ArGlobalFunctor1<ArNetPacket *> drawingCB(&drawing); Aria::init(); //ArLog::init(ArLog::StdOut, ArLog::Verbose); ArArgumentParser parser(&argc, argv); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); /* Check for -help, and unhandled arguments: */ if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed()) { Aria::logOptions(); exit(0); } /* Connect our client object to the remote server: */ if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server '%s' rejected connection, exiting\n", client.getHost()); else printf("Could not connect to server '%s', exiting\n", client.getHost()); exit(1); } printf("Connected to server.\n"); client.addHandler("listDrawings", &drawingCB); client.requestOnce("listDrawings"); client.runAsync(); while (client.getRunningWithLock()) { ArUtil::sleep(1); //printf("%d ms since last data\n", client.getLastPacketReceived().mSecSince()); } Aria::shutdown(); return 0; }
int main(int argc, char **argv) { std::string hostname; Aria::init(); //ArLog::init(ArLog::StdOut, ArLog::Verbose); if (argc == 1) hostname = "localhost"; else hostname = argv[1]; if (!client.blockingConnect(hostname.c_str(), 7272)) { printf("Could not connect to server, exiting\n"); exit(1); } /* ArGlobalFunctor1<ArNetPacket *> getDirListingCB(&getDirListing); client.addHandler("getDirListing", &getDirListingCB); //client.requestOnceWithString("getDirListing", ""); ArGlobalFunctor1<ArNetPacket *> getFileCB(&netGetFile); client.addHandler("getFile", &getFileCB); client.requestOnceWithString("getFile", "all.bob"); ArGlobalFunctor1<ArNetPacket *> netPutFileCB(&netPutFile); client.addHandler("putFile", &netPutFileCB); putFile("doxygen.conf", "ArGH/DoxYGEN"); */ ArGlobalFunctor1<ArNetPacket *> deleteFileCB(&netDeleteFile); client.addHandler("deleteFile", &deleteFileCB); client.requestOnceWithString("deleteFile", "1/all.bob"); client.runAsync(); while (client.getRunningWithLock()) { ArUtil::sleep(1); } Aria::shutdown(); return 0; }
int main(int argc, char **argv) { Aria::init(); ArClientBase client; ArArgumentParser parser(&argc, argv); /* This will be used to connect our client to the server. * It will get the hostname from the -host command line argument: */ ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); /* Check for -host, -help, ARIA arguments, and unhandled arguments: */ if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed()) { Aria::logOptions(); Aria::exit(0); } /* Connect our client object to the remote server: */ if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server '%s' rejected connection, exiting\n", client.getHost()); else printf("Could not connect to server '%s', exiting\n", client.getHost()); Aria::exit(1); } printf("Connected to server.\n"); client.setRobotName(client.getHost()); // include server name in log messages client.runAsync(); ArNetPacket request; // request. // client.requestOnceByCommand(ArCommands::ENABLE, ) ArClientHandlerRobotUpdate updates(&client); // client.requestOnce("enableMotor"); ArGlobalFunctor1<ArNetPacket*> enableCB(&enable); ArGlobalFunctor1<ArNetPacket *> getFileCB(&netGetFile); ArGlobalFunctor1<ArNetPacket*> recieveDataCB(&recieveData); client.addHandler("requestEnableMotor", &enableCB); client.addHandler("handleCheckObjectData", &recieveDataCB); //client.addHandler("getFile", &getFileCB); client.requestOnce("requestEnableMotor"); client.request("handleCheckObjectData", 10); updates.requestUpdates(); if (checkObject) client.requestOnceWithString("getFile", "./image/ball.jpg"); ArPose pose; namedWindow("image", 0); while (client.getRunningWithLock()) { //client.requestOnce("sendData"); if (checkObject) { // if (!a) { cout <<"OK"<<endl; // client.requestOnceWithString("getFile", "./image/ball.jpg"); client.addHandler("getFile", &getFileCB); // client.remHandler("getFile", &getFileCB); //} else { //client.remHandler("getFile", &getFileCB); //} Mat image; image = imread("./image/ball.jpg", CV_LOAD_IMAGE_COLOR); imshow("image", image); char c = (char)waitKey(10); if( c == 27 ) break; } ArUtil::sleep(200); } // client.requestStop("getFile"); cout <<"Da tim thay qua bong o vi tri pose("<<pose.getX()<<", "<<pose.getY()<<")"<<endl; cout <<"Vi tri pose("<<pose.getX()<<", "<<pose.getY()<<")"<<endl; /* The client stopped running, due to disconnection from the server, general * Aria shutdown, or some other reason. */ client.disconnect(); Aria::exit(0); return 0; }
void NavigationClient::Main() { std::cout << "Navigation client started" << std::endl; int argsNumber; argsNumber = 3; char *arguments[argsNumber]; arguments[0]="./arg_test"; arguments[1]="-host"; //arguments[2]="10.41.42.1"; //se puede poner también patrolbot arguments[2]="77.7.27.1"; int robotCase, counter; ArClientBase client; ArPose pose(0, 0, 0); ArPose GoToPose(3000.0, 0.0, -90.0); ArNetPacket posePacket, directGoToPosePacket; ArArgumentParser parser(&argsNumber, arguments);posePacket.empty(); ArClientSimpleConnector clientConnector(&parser); parser.loadDefaultArguments(); headingsForBedroom.push_back(45); headingsForBedroom.push_back(25); headingsForBedroom.push_back(0); headingsForLiving.push_back(-20); headingsForLiving.push_back(-55); headingsForLiving.push_back(-80); headingsForLiving.push_back(-110); headingsForLiving.push_back(-140); openDoor = false; if (!clientConnector.parseArgs() || !parser.checkHelpAndWarnUnparsed()) { clientConnector.logOptions(); exit(0); } printf("Connecting...\n"); if (!clientConnector.connectClient(&client)) { if (client.wasRejected()) printf("Server rejected connection, exiting\n"); else printf("Could not connect to server, exiting\n"); exit(1); } printf("Connected to server.\n"); client.addHandler("pathPlannerStatus", new ArGlobalFunctor1<ArNetPacket*>(&handlePathPlannerStatus)); client.addHandler("update", new ArGlobalFunctor1<ArNetPacket*>(&handleRobotUpdate)); client.addHandler("goalName", new ArGlobalFunctor1<ArNetPacket*>(&handleGoalName)); client.addHandler("getGoals", new ArGlobalFunctor1<ArNetPacket*>(&handleGoalList)); client.addHandler("getSensorCurrent", new ArGlobalFunctor1<ArNetPacket*>(&handleSensorCurrent)); client.addHandler("getSensorList", new ArGlobalFunctor1<ArNetPacket*>(&handleSensorList)); client.addHandler("getLocState", new ArGlobalFunctor1<ArNetPacket*>(&handleLocState)); client.runAsync(); client.requestOnce("getGoals"); client.requestOnce("getSensorList"); client.requestOnceWithString("getSensorCurrent", "lms2xx_1"); // client.request("pathPlannerStatus", 5000); client.request("goalName", 1000); client.request("update", 1000); client.requestOnce("getLocState"); sleep(2); int cont =0; while (!openDoor) { cont++; ArUtil::sleep(2000); client.requestOnceWithString("getSensorCurrent", "lms2xx_1"); } printf("*** Door has been OPENED *** \n"); sleep(2); if (client.dataExists("localizeToPose")) { printf(".. Server does have \"localizeToPose\" request.\n"); posePacket.byte4ToBuf(sharedMemory->getInstance().getLocalizationRobotPosition().get_X()); posePacket.byte4ToBuf(sharedMemory->getInstance().getLocalizationRobotPosition().get_Y()); posePacket.byte4ToBuf(sharedMemory->getInstance().getLocalizationRobotPosition().get_Angle()); client.requestOnce("localizeToPose", &posePacket); ArUtil::sleep(1500); } else printf(".. Server doesn't have that request.\n"); for(;;){ string action = sharedMemory->getInstance().getAction(); if (action=="navigate"){ cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("turn"); }if (action=="navigateToParty"){ cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sleep(6); sharedMemory->getInstance().startDownToRotations=false; sharedMemory->getInstance().sintetizer.set_Phrase("If you need something please wave your hand to my bottom kinect"); sleep(8); indexHeading=0; sharedMemory->getInstance().setAction("turn"); } else if (action=="navigateBackToEmergency"){ cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); // sharedMemory->sintetizer.set_Phrase("Emergency Situation resolved"); sharedMemory->getInstance().setAction("createReport"); }else if (action=="navigateToEntrance"){ cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; sharedMemory->getInstance().sintetizer.set_Phrase("Do not worry, I have called the ambulance"); sleep(2); sharedMemory->getInstance().sintetizer.set_Phrase("Please wait a moment, I willl wait for them"); sleep(2); navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("waitForAmbulance"); } else if (action=="navigateCloseTo"){ cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("requestEmergencyObjects"); } else if (action=="navigateToHome"){ cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("requestCommand"); } else if (action=="navigateToQuestions"){ cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("requestQuestions"); } else if (action=="navigateToObject"){ //solo es utilizado por cocktail Party //Si se quita la indicación de lugar en requestOptions aqui debe mandarse el destino predefinido (kitchen?) cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; navigateTo(sharedMemory->getInstance().getStringDestination(), &client); sharedMemory->getInstance().setAction("recognizeObject"); } else if (action=="navigateToObjectCategory"){ //considera que la posición de la categoria de un objeto (en pick and place) es la misma posición que la de donde esta el objeto en emergencia. cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; //por default ahorita esta dining como el la categoria del objeto navigateTo(sharedMemory->getInstance().getStringDestination(), &client); if (sharedMemory->getInstance().getTestRunning()=="pick and place" || sharedMemory->getInstance().getTestRunning()=="Emergency" ) sharedMemory->getInstance().setAction("deliverObject"); else sharedMemory->getInstance().setAction("userRecognize"); }else if (action=="navigateToPoint"){ cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; //TODO verificar que esto limpia el objeto posePacket.empty(); posePacket.byte4ToBuf(sharedMemory->getInstance().lastObjective->getObjetivePosition().get_X()); posePacket.byte4ToBuf(sharedMemory->getInstance().lastObjective->getObjetivePosition().get_Y()); posePacket.byte4ToBuf(sharedMemory->getInstance().lastObjective->getObjetivePosition().get_Angle()); cout << "Enviando punto a navegación: "<< sharedMemory->getInstance().lastObjective->getObjetivePosition().get_X() << "," << sharedMemory->getInstance().lastObjective->getObjetivePosition().get_Y() << "," << sharedMemory->getInstance().lastObjective->getObjetivePosition().get_Angle()<<endl; client.requestOnce("gotoPose", &posePacket); sleep(10); printf("Before while Navigation"); while (strncmp(textData, "Arrived at", 10) != 0){ sleep(10); } printf("Navigation ended"); if (sharedMemory->getInstance().getTestRunning()=="CocktailParty") sharedMemory->getInstance().setAction("userLearn"); else sharedMemory->getInstance().setAction("requestEmergencyObjects"); }else if (action=="navigateForward"){ stringstream command; cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; command<<"8 " << sharedMemory->getInstance().getGestureDepthPosition(); cout<< "****** AVANZA "<<command.str().c_str()<<" mm"<<endl; client.requestOnceWithString("MicroControllerMotionCommand",command.str().c_str()); sleep(10); printf("Before while Navigation"); while (strncmp(textData, "Stopped", 10) != 0){ sleep(10); } sharedMemory->getInstance().setAction("turn"); }else if (action=="turn"){ int heading=0; stringstream command; cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; if (sharedMemory->getInstance().startDownToRotations==false){ if (sharedMemory->getInstance().getStringDestination()=="bedroom"){ cout<<"Entrando BEDROOM 1"<<endl; if (indexHeading < headingsForBedroom.size()){ heading=headingsForBedroom[indexHeading]; indexHeading++; cout<<"Entrando a If UNO bedroom"<<endl; }else{ sharedMemory->getInstance().startDownToRotations=true; indexHeading=headingsForBedroom.size()-2; heading=(-1000);//valor dado para detectar que no se obtuvo un valor válido para el heading, dado que se cambia la forma en como se recorre el arreglo cout<<"Entrando a else UNO bedroom"<<endl; } }else {//if (sharedMemory->getInstance().getStringDestination()=="living"){ cout<<"Entrando a LIVING 1"<<endl; if (indexHeading < headingsForLiving.size()){ heading=headingsForLiving[indexHeading]; indexHeading++; cout<<"Entrando a If UNO living"<<endl; }else{ sharedMemory->getInstance().startDownToRotations=true; indexHeading=headingsForLiving.size()-2;//no menos uno porque ya el proceso anterior permition visitar este indice heading=(-1000); cout<<"Entrando a else UNO Living"<<endl; } } }else{ if (sharedMemory->getInstance().getStringDestination()=="bedroom"){ cout<<"Entrando BEDROoM 2"<<endl; if (indexHeading >= 0){ heading=headingsForBedroom[indexHeading]; indexHeading--; cout<<"Entrando a if DOS bedroom"<<endl; }else{ sharedMemory->getInstance().startDownToRotations=false; indexHeading=1; heading=(-1000); cout<<"Entrando a else DOS bedroom"<<endl; } }else {//if (sharedMemory->getInstance().getStringDestination()=="living"){ cout<<"Entrando a LIVING 2"<<endl; if (indexHeading>= 0){ heading=headingsForLiving[indexHeading]; indexHeading--; cout<<"Entrando a if DOS living"<<endl; }else{ sharedMemory->getInstance().startDownToRotations=false; indexHeading=1;//no 0 porque ya el proceso anterior permitió visitar este indice heading=(-1000); cout<<"Entrando a else DOS living"<<endl; } } } if (heading>(-1000)){ command<<"12 " << heading; cout<< "****** ROTAR "<<command.str().c_str()<<" grades con INDEXHEADING: "<<indexHeading<<"valorArray"<< headingsForLiving[indexHeading]<<endl; client.requestOnceWithString("MicroControllerMotionCommand",command.str().c_str()); //sharedMemory->getInstance().sintetizer.set_Phrase("If you need something, please wave your hand to my bottom kinect"); sleep(1); cout<<"*INVERSA al hacer el heading: "<< sharedMemory->getInstance().startDownToRotations << endl; sharedMemory->getInstance().setAction("payAttention"); } }else if (action=="navigateToExit"){ //éste estado solo llamarlo para terminar la prueba cout<<"Starting: "<< action << "STATE in NavigationClient"<<endl; navigateTo("Exit", &client); sharedMemory->getInstance().setAction("turnOff");; } else if (action=="turnOff"){ cout<<"Starting: "<< action << " STATE in NavigationClient"<<endl; //ArUtil::sleep(60000); printf("Server disconnected.\n"); Aria::shutdown(); } } return ; }