From a76f8a46cde507d172be1ea9ba42cf7f0a6f251a Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Fri, 22 Mar 2013 11:20:45 -0600 Subject: [PATCH] Handle new and existing agent Ids --- domain/src/main.cpp | 2 ++ shared/src/Agent.cpp | 4 ++++ shared/src/Agent.h | 1 + shared/src/AgentList.cpp | 25 +++++++++++++++++++++---- shared/src/AgentList.h | 6 ++++-- shared/src/UDPSocket.cpp | 2 +- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/domain/src/main.cpp b/domain/src/main.cpp index cc51bb79b6..05fb088329 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -50,7 +50,9 @@ AgentList agentList(DOMAIN_LISTEN_PORT); unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { *currentPosition++ = agentToAdd->getType(); + // FIX THIS - NOT ONE BYTE currentPosition += agentToAdd->getAgentId(); + // --- currentPosition += packSocket(currentPosition, agentToAdd->getPublicSocket()); currentPosition += packSocket(currentPosition, agentToAdd->getLocalSocket()); diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index b95c3e7dbd..269703260f 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -162,6 +162,10 @@ bool Agent::matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, cha && socketMatch(localSocket, otherLocalSocket); } +bool Agent::exists(uint16_t *otherAgentId) { + return agentId == *otherAgentId; +} + std::ostream& operator<<(std::ostream& os, const Agent* agent) { sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; diff --git a/shared/src/Agent.h b/shared/src/Agent.h index 087d828b49..e5fa583f20 100644 --- a/shared/src/Agent.h +++ b/shared/src/Agent.h @@ -28,6 +28,7 @@ class Agent { bool operator==(const Agent& otherAgent); bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); + bool exists(uint16_t *agentId); char getType(); void setType(char newType); uint16_t getAgentId(); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 13869f53af..134672e971 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -109,10 +109,16 @@ int AgentList::indexOfMatchingAgent(sockaddr *senderAddress) { return -1; } +int AgentList::unpackAgentId(unsigned char *packedData, uint16_t *agentId) { + memcpy(packedData, agentId, sizeof(uint16_t)); + return sizeof(uint16_t); +} + int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; char agentType; + uint16_t agentId; // assumes only IPv4 addresses sockaddr_in agentPublicSocket; @@ -125,17 +131,21 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { while((readPtr - startPtr) < dataBytes) { agentType = *readPtr++; + readPtr += unpackAgentId(readPtr, (uint16_t *)&agentId); readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); - addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + //syncClientAgentList(agentId, (sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType); + + addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); } return readAgents; } -bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType) { +bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId = 0) { std::vector::iterator agent; + uint16_t thisAgentId; for(agent = agents.begin(); agent != agents.end(); agent++) { if (agent->matches(publicSocket, localSocket, agentType)) { @@ -146,8 +156,15 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, if (agent == agents.end()) { // we didn't have this agent, so add them - Agent newAgent = Agent(publicSocket, localSocket, agentType, this->lastAgentId); - ++this->lastAgentId; + + if (agentId == 0) { + thisAgentId = this->lastAgentId; + ++this->lastAgentId; + } else { + thisAgentId = agentId; + } + + Agent newAgent = Agent(publicSocket, localSocket, agentType, thisAgentId); if (socketMatch(publicSocket, localSocket)) { // likely debugging scenario with DS + agent on local network diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index e152815ad1..9d6e9991dc 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -35,9 +35,11 @@ class AgentList { std::vector& getAgents(); UDPSocket& getAgentSocket(); - + int updateList(unsigned char *packetData, size_t dataBytes); - bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType); + bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); + int unpackAgentId(unsigned char *packedData, uint16_t *agentId); + int packAgentId(unsigned char *packStore, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void broadcastToAgents(char *broadcastData, size_t dataBytes); diff --git a/shared/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp index f4bceb884f..436b627045 100644 --- a/shared/src/UDPSocket.cpp +++ b/shared/src/UDPSocket.cpp @@ -115,7 +115,7 @@ bool UDPSocket::receive(sockaddr *recvAddress, void *receivedData, ssize_t *rece socklen_t addressSize = sizeof(&recvAddress); *receivedBytes = recvfrom(handle, static_cast(receivedData), MAX_BUFFER_LENGTH_BYTES, - 0, recvAddress, reinterpret_cast(&addressSize)); + 0, recvAddress, &addressSize); return (*receivedBytes > 0); }