/** Open the server, if you supply a robot this will run in the robots attached, if you do not supply a robot then it will be open and you'll have to call runOnce yourself (this is only recommended for advanced users) @param robot the robot that this should be attached to and run in the sync task of or NULL not to run in any robot's task @param port the port to start up the service on @param password the password needed to use the service @param multipleClients if false only one client is allowed to connect, if false multiple clients are allowed to connect or just one @return true if the server could be started, false otherwise **/ AREXPORT bool ArNetServer::open(ArRobot *robot, unsigned int port, const char *password, bool multipleClients, const char *openOnIP) { ArSyncTask *rootTask = NULL; ArSyncTask *proc = NULL; std::string taskName; if (myOpened) { ArLog::log(ArLog::Terse, "ArNetServer already inited, cannot reinit"); return false; } myRobot = robot; myPort = port; myPassword = password; myMultipleClients = multipleClients; if (myServerSocket.open(myPort, ArSocket::TCP, openOnIP)) { myServerSocket.setLinger(0); myServerSocket.setNonBlock(); if (openOnIP != NULL) ArLog::log(ArLog::Normal, "ArNetServer opened on port %d on ip %s.", myPort, openOnIP); else ArLog::log(ArLog::Normal, "ArNetServer opened on port %d.", myPort); myOpened = true; } else { ArLog::log(ArLog::Terse, "ArNetServer failed to open: %s", myServerSocket.getErrorStr().c_str()); myOpened = false; return false; } // add ourselves to the robot if we aren't already there if (myRobot != NULL && (rootTask = myRobot->getSyncTaskRoot()) != NULL) { proc = rootTask->findNonRecursive(&myTaskCB); if (proc == NULL) { // toss in a netserver taskName = "Net Servers "; taskName += myPort; rootTask->addNewLeaf(taskName.c_str(), 60, &myTaskCB, NULL); } } return true; }
ArNetServer::~ArNetServer() { ArSyncTask *rootTask = NULL; ArSyncTask *proc = NULL; // get rid of us running on the robot task if (myRobot != NULL && (rootTask = myRobot->getSyncTaskRoot()) != NULL) { proc = rootTask->findNonRecursive(&myTaskCB); if (proc != NULL) delete proc; } close(); }