diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 1da0a0215a..67d2a1e021 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -18,13 +18,47 @@ const long long ASSIGNMENT_REQUEST_INTERVAL_USECS = 1 * 1000 * 1000; + int main(int argc, const char* argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); + sockaddr_in customAssignmentSocket = {}; + + // grab the overriden assignment-server hostname from argv, if it exists + const char* customAssignmentServer = getCmdOption(argc, argv, "-a"); + if (customAssignmentServer) { + customAssignmentSocket = socketForHostnameAndHostOrderPort(customAssignmentServer, ASSIGNMENT_SERVER_PORT); + } + + const char* NUM_FORKS_PARAMETER = "-n"; + const char* numForksIncludingParentString = getCmdOption(argc, argv, NUM_FORKS_PARAMETER); + + if (numForksIncludingParentString) { + int numForksIncludingParent = atoi(numForksIncludingParentString); + qDebug() << "Starting" << numForksIncludingParent << "assignment clients."; + + int processID = 0; + + // fire off as many children as we need (this is one less than the parent since the parent will run as well) + for (int i = 0; i < numForksIncludingParent - 1; i++) { + processID = fork(); + + if (processID == 0) { + // this is one of the children, break so we don't start a fork bomb + break; + } + } + } + // create a NodeList as an unassigned client NodeList* nodeList = NodeList::createInstance(NODE_TYPE_UNASSIGNED); + // set the custom assignment socket if we have it + if (customAssignmentSocket.sin_addr.s_addr != 0) { + nodeList->setAssignmentServerSocket((sockaddr*) &customAssignmentSocket); + } + // change the timeout on the nodelist socket to be as often as we want to re-request nodeList->getNodeSocket()->setBlockingReceiveTimeoutInUsecs(ASSIGNMENT_REQUEST_INTERVAL_USECS); @@ -34,10 +68,8 @@ int main(int argc, const char* argv[]) { ssize_t receivedBytes = 0; // grab the assignment pool from argv, if it was passed - const char* assignmentPool = getCmdOption(argc, argv, "-p"); - - // set the overriden assignment-server hostname from argv, if it exists - nodeList->setAssignmentServerHostname(getCmdOption(argc, argv, "-a")); + const char* ASSIGNMENT_POOL_PARAMETER = "-p"; + const char* assignmentPool = getCmdOption(argc, argv, ASSIGNMENT_POOL_PARAMETER); // create a request assignment, accept all assignments, pass the desired pool (if it exists) Assignment requestAssignment(Assignment::Request, Assignment::All, assignmentPool); @@ -46,7 +78,6 @@ int main(int argc, const char* argv[]) { if (usecTimestampNow() - usecTimestamp(&lastRequest) >= ASSIGNMENT_REQUEST_INTERVAL_USECS) { gettimeofday(&lastRequest, NULL); // if we're here we have no assignment, so send a request - qDebug() << "Sending an assignment request -" << requestAssignment; nodeList->sendAssignment(requestAssignment); } @@ -69,7 +100,6 @@ int main(int argc, const char* argv[]) { if (deployedAssignment.getType() == Assignment::AudioMixer) { AudioMixer::run(); } else { - qDebug() << "Running as an avatar mixer!"; AvatarMixer::run(); } diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 32a88e8e08..c8916f1c59 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -89,7 +89,11 @@ int main(int argc, const char* argv[]) { const char* assignmentPool = getCmdOption(argc, argv, "-p"); // grab the overriden assignment-server hostname from argv, if it exists - nodeList->setAssignmentServerHostname(getCmdOption(argc, argv, "-a")); + const char* customAssignmentServer = getCmdOption(argc, argv, "-a"); + if (customAssignmentServer) { + sockaddr_in customAssignmentSocket = socketForHostnameAndHostOrderPort(customAssignmentServer, ASSIGNMENT_SERVER_PORT); + nodeList->setAssignmentServerSocket((sockaddr*) &customAssignmentSocket); + } // use a map to keep track of iterations of silence for assignment creation requests const long long ASSIGNMENT_SILENCE_MAX_USECS = 5 * 1000 * 1000; diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index ad5876f622..4d042b0f63 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -65,7 +65,8 @@ NodeList::NodeList(char newOwnerType, unsigned short int newSocketListenPort) : _nodeTypesOfInterest(NULL), _ownerID(UNKNOWN_NODE_ID), _lastNodeID(UNKNOWN_NODE_ID + 1), - _numNoReplyDomainCheckIns(0) + _numNoReplyDomainCheckIns(0), + _assignmentServerSocket(NULL) { memcpy(_domainHostname, DEFAULT_DOMAIN_HOSTNAME, sizeof(DEFAULT_DOMAIN_HOSTNAME)); memcpy(_domainIP, DEFAULT_DOMAIN_IP, sizeof(DEFAULT_DOMAIN_IP)); @@ -376,7 +377,8 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte } const char GLOBAL_ASSIGNMENT_SERVER_HOSTNAME[] = "assignment.highfidelity.io"; - +const sockaddr_in GLOBAL_ASSIGNMENT_SOCKET = socketForHostnameAndHostOrderPort(GLOBAL_ASSIGNMENT_SERVER_HOSTNAME, + ASSIGNMENT_SERVER_PORT); void NodeList::sendAssignment(Assignment& assignment) { unsigned char assignmentPacket[MAX_PACKET_SIZE]; @@ -387,13 +389,11 @@ void NodeList::sendAssignment(Assignment& assignment) { int numHeaderBytes = populateTypeAndVersion(assignmentPacket, assignmentPacketType); int numAssignmentBytes = assignment.packToBuffer(assignmentPacket + numHeaderBytes); - // setup the assignmentServerSocket once, use a custom assignmentServerHostname if it is present - static sockaddr_in assignmentServerSocket = socketForHostnameAndHostOrderPort((_assignmentServerHostname != NULL - ? (const char*) _assignmentServerHostname - : GLOBAL_ASSIGNMENT_SERVER_HOSTNAME), - ASSIGNMENT_SERVER_PORT); - - _nodeSocket.send((sockaddr*) &assignmentServerSocket, assignmentPacket, numHeaderBytes + numAssignmentBytes); + sockaddr* assignmentServerSocket = (_assignmentServerSocket == NULL) + ? (sockaddr*) &GLOBAL_ASSIGNMENT_SOCKET + : _assignmentServerSocket; + + _nodeSocket.send((sockaddr*) assignmentServerSocket, assignmentPacket, numHeaderBytes + numAssignmentBytes); } Node* NodeList::addOrUpdateNode(sockaddr* publicSocket, sockaddr* localSocket, char nodeType, uint16_t nodeId) { diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index dad422a29b..ea94e8c080 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -99,7 +99,7 @@ public: void sendDomainServerCheckIn(); int processDomainServerList(unsigned char *packetData, size_t dataBytes); - void setAssignmentServerHostname(const char* serverHostname) { _assignmentServerHostname = serverHostname; } + void setAssignmentServerSocket(sockaddr* serverSocket) { _assignmentServerSocket = serverSocket; } void sendAssignment(Assignment& assignment); Node* nodeWithAddress(sockaddr *senderAddress); @@ -152,7 +152,7 @@ private: pthread_t removeSilentNodesThread; pthread_t checkInWithDomainServerThread; int _numNoReplyDomainCheckIns; - const char* _assignmentServerHostname; + sockaddr* _assignmentServerSocket; void handlePingReply(sockaddr *nodeAddress); void timePingReply(sockaddr *nodeAddress, unsigned char *packetData);