add a domain socket to assignments

This commit is contained in:
Stephen Birarda 2013-09-04 13:00:23 -07:00
parent 94367dd7c7
commit fa7f183930
6 changed files with 58 additions and 12 deletions

View file

@ -61,7 +61,9 @@ int main(int argc, char* const argv[]) {
qDebug() << "Received an assignment - " << assignmentType << "\n";
AudioMixer::run();
// pull the creator sockaddr_in from the assignment and change our domain IP to that
// AudioMixer::run();
// reset our NodeList by switching back to unassigned and clearing the list
nodeList->setOwnerType(NODE_TYPE_UNASSIGNED);

View file

@ -30,7 +30,7 @@ int main(int argc, const char* argv[]) {
UDPSocket serverSocket(ASSIGNMENT_SERVER_PORT);
unsigned char assignmentPacket[MAX_PACKET_SIZE_BYTES];
int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_CREATE_ASSIGNMENT);
int numSendHeaderBytes = populateTypeAndVersion(assignmentPacket, PACKET_TYPE_DEPLOY_ASSIGNMENT);
while (true) {
if (serverSocket.receive((sockaddr*) &senderSocket, &senderData, &receivedBytes)) {
@ -42,26 +42,30 @@ int main(int argc, const char* argv[]) {
Assignment firstAssignment = assignmentQueue.front();
assignmentQueue.pop();
*(assignmentPacket + numSendHeaderBytes) = firstAssignment.getType();
int numAssignmentBytes = firstAssignment.packToBuffer(assignmentPacket + numSendHeaderBytes);
// send the assignment
serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + sizeof(unsigned char));
serverSocket.send((sockaddr*) &senderSocket, assignmentPacket, numSendHeaderBytes + numAssignmentBytes);
}
} else if (senderData[0] == PACKET_TYPE_CREATE_ASSIGNMENT && packetVersionMatch(senderData)) {
// memcpy the sent assignment
Assignment createdAssignment(senderData + numBytesForPacketHeader(senderData));
int numHeaderBytes = numBytesForPacketHeader(senderData);
Assignment createdAssignment(senderData + numHeaderBytes, receivedBytes - numHeaderBytes);
qDebug() << "Received an assignment:" << createdAssignment;
// assignment server is on a public server
// assume that the address we now have for the sender is the public address/port
// and store that with the assignment so it can be given to the requestor later
createdAssignment.setDomainSocket((sockaddr*) &senderSocket);
// until we have a GUID setup just keep the latest assignment
if (assignmentQueue.size() > 0) {
assignmentQueue.pop();
}
// add this assignment to the queue
// assignmentQueue.push(newAssignment);
assignmentQueue.push(createdAssignment);
}
}
}

View file

@ -10,7 +10,8 @@
Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool) :
_direction(direction),
_type(type)
_type(type),
_domainSocket(NULL)
{
// copy the pool, if we got one
if (pool) {
@ -22,7 +23,9 @@ Assignment::Assignment(Assignment::Direction direction, Assignment::Type type, c
}
}
Assignment::Assignment(const unsigned char* dataBuffer) {
Assignment::Assignment(const unsigned char* dataBuffer, int numBytes) :
_domainSocket(NULL)
{
int numBytesRead = 0;
memcpy(&_direction, dataBuffer, sizeof(Assignment::Direction));
@ -34,6 +37,11 @@ Assignment::Assignment(const unsigned char* dataBuffer) {
int poolLength = strlen((const char*) dataBuffer + numBytesRead);
_pool = new char[poolLength + sizeof(char)];
strcpy(_pool, (char*) dataBuffer + numBytesRead);
numBytesRead += poolLength + sizeof(char);
if (numBytes > numBytesRead) {
memcpy(_domainSocket, dataBuffer + numBytesRead, sizeof(sockaddr));
}
}
int Assignment::packToBuffer(unsigned char* buffer) {
@ -48,9 +56,36 @@ int Assignment::packToBuffer(unsigned char* buffer) {
strcpy((char*) buffer + numPackedBytes, _pool);
numPackedBytes += strlen(_pool) + sizeof(char);
if (_domainSocket) {
memcpy(buffer + numPackedBytes, _domainSocket, sizeof(sockaddr));
numPackedBytes += sizeof(sockaddr);
}
return numPackedBytes;
}
void Assignment::setDomainSocket(const sockaddr* domainSocket) {
if (_domainSocket) {
// delete the old _domainSocket if it exists
delete _domainSocket;
_domainSocket = NULL;
}
if (!_domainSocket) {
// create a new sockaddr or sockaddr_in depending on what type of address this is
if (domainSocket->sa_family == AF_INET) {
sockaddr_in* newSocket = new sockaddr_in;
memcpy(newSocket, domainSocket, sizeof(sockaddr_in));
_domainSocket = (sockaddr*) newSocket;
} else {
sockaddr_in6* newSocket = new sockaddr_in6;
memcpy(newSocket, domainSocket, sizeof(sockaddr_in6));
_domainSocket = (sockaddr*) newSocket;
}
}
}
QDebug operator<<(QDebug debug, const Assignment &assignment) {
debug << "T:" << assignment.getType() << "P:" << assignment.getPool();
return debug.nospace();

View file

@ -25,18 +25,22 @@ public:
};
Assignment(Assignment::Direction direction, Assignment::Type type, const char* pool = NULL);
Assignment(const unsigned char* dataBuffer);
Assignment(const unsigned char* dataBuffer, int numBytes);
Assignment::Direction getDirection() const { return _direction; }
Assignment::Type getType() const { return _type; }
const char* getPool() const { return _pool; }
const sockaddr* getDomainSocket() { return _domainSocket; }
void setDomainSocket(const sockaddr* domainSocket);
int packToBuffer(unsigned char* buffer);
private:
Assignment::Direction _direction;
Assignment::Type _type;
char* _pool;
sockaddr* _domainSocket;
};
QDebug operator<<(QDebug debug, const Assignment &assignment);

View file

@ -31,7 +31,7 @@ const char SOLO_NODE_TYPES[2] = {
};
const char DEFAULT_DOMAIN_HOSTNAME[MAX_HOSTNAME_BYTES] = "root.highfidelity.io";
const char DEFAULT_DOMAIN_IP[INET_ADDRSTRLEN] = "10.0.0.20"; // IP Address will be re-set by lookup on startup
const char DEFAULT_DOMAIN_IP[INET_ADDRSTRLEN] = ""; // IP Address will be re-set by lookup on startup
const int DEFAULT_DOMAINSERVER_PORT = 40102;
bool silentNodeThreadStopFlag = false;

View file

@ -37,6 +37,7 @@ const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L';
const PACKET_TYPE PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY = 'C';
const PACKET_TYPE PACKET_TYPE_REQUEST_ASSIGNMENT = 'r';
const PACKET_TYPE PACKET_TYPE_CREATE_ASSIGNMENT = 's';
const PACKET_TYPE PACKET_TYPE_DEPLOY_ASSIGNMENT = 'd';
const PACKET_TYPE PACKET_TYPE_VOXEL_STATS = '#';
const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION = 'J';
const PACKET_TYPE PACKET_TYPE_VOXEL_JURISDICTION_REQUEST = 'j';