diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 753009ffa9..95da95c210 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -86,7 +86,6 @@ int main(int argc, const char * argv[]) unsigned char* currentBufferPos; unsigned char* startPointer; - int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; agentLocalAddress.sin_family = AF_INET; @@ -95,6 +94,8 @@ int main(int argc, const char * argv[]) agentList->startSilentAgentRemovalThread(); + uint16_t packetAgentID = 0; + while (true) { if (agentList->getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_HEADER_DOMAIN_RFD || packetData[0] == PACKET_HEADER_DOMAIN_LIST_REQUEST)) { @@ -143,13 +144,17 @@ int main(int argc, const char * argv[]) } } else { double timeNow = usecTimestampNow(); + // this is the agent, just update last receive to now agent->setLastHeardMicrostamp(timeNow); + // grab the ID for this agent so we can send it back with the packet + packetAgentID = agent->getAgentId(); + if (packetData[0] == PACKET_HEADER_DOMAIN_RFD && memchr(SOLO_AGENT_TYPES, agentType, sizeof(SOLO_AGENT_TYPES))) { agent->setWakeMicrostamp(timeNow); - } + } } } @@ -160,11 +165,13 @@ int main(int argc, const char * argv[]) currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, soloAgent->second); } - if ((packetBytesWithoutLeadingChar = (currentBufferPos - startPointer))) { - agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress, - broadcastPacket, - packetBytesWithoutLeadingChar + 1); - } + // add the agent ID to the end of the pointer + currentBufferPos += packAgentId(currentBufferPos, packetAgentID); + + // send the constructed list back to this agent + agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress, + broadcastPacket, + (currentBufferPos - startPointer) + 1); } } diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 8f17b75af3..213a6a55ab 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -89,7 +89,7 @@ unsigned int AgentList::getSocketListenPort() { void AgentList::processAgentData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { case PACKET_HEADER_DOMAIN: { - updateList(packetData, dataBytes); + processDomainServerList(packetData, dataBytes); break; } case PACKET_HEADER_PING: { @@ -200,7 +200,7 @@ void AgentList::increaseAgentId() { ++lastAgentId; } -int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { +int AgentList::processDomainServerList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; char agentType; @@ -215,14 +215,17 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { unsigned char *readPtr = packetData + 1; unsigned char *startPtr = packetData; - while((readPtr - startPtr) < dataBytes) { + while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) { agentType = *readPtr++; readPtr += unpackAgentId(readPtr, (uint16_t *)&agentId); readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); - } + } + + // read out our ID from the packet + unpackAgentId(readPtr, &_ownerID); return readAgents; } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 5544c3c0fd..f9c9b35341 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -56,7 +56,7 @@ public: void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } - int updateList(unsigned char *packetData, size_t dataBytes); + int processDomainServerList(unsigned char *packetData, size_t dataBytes); Agent* agentWithAddress(sockaddr *senderAddress); Agent* agentWithID(uint16_t agentID);