From 01816ccda3f31c78144ea00095cd2e02f50eb660 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 1 May 2013 14:23:25 -0700 Subject: [PATCH 1/7] add a base config for a pairing server --- CMakeLists.txt | 1 + pairing-server/CMakeLists.txt | 13 +++++++++++++ pairing-server/src/main.cpp | 13 +++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 pairing-server/CMakeLists.txt create mode 100644 pairing-server/src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3923f543fa..2a4a8d6c01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,5 +8,6 @@ add_subdirectory(domain-server) add_subdirectory(eve) add_subdirectory(interface) add_subdirectory(injector) +add_subdirectory(pairing-server) add_subdirectory(space-server) add_subdirectory(voxel-server) \ No newline at end of file diff --git a/pairing-server/CMakeLists.txt b/pairing-server/CMakeLists.txt new file mode 100644 index 0000000000..9feb1aa424 --- /dev/null +++ b/pairing-server/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.8) + +set(ROOT_DIR ..) +set(MACRO_DIR ${ROOT_DIR}/cmake/macros) + +set(TARGET_NAME pairing-server) + +include(${MACRO_DIR}/SetupHifiProject.cmake) +setup_hifi_project(${TARGET_NAME}) + +# link the shared hifi library +include(${MACRO_DIR}/LinkHifiLibrary.cmake) +link_hifi_library(shared ${TARGET_NAME} ${ROOT_DIR}) \ No newline at end of file diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp new file mode 100644 index 0000000000..bfbed4ed88 --- /dev/null +++ b/pairing-server/src/main.cpp @@ -0,0 +1,13 @@ +// +// main.cpp +// pairing-server +// +// Created by Stephen Birarda on 5/1/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +int main(int argc, const char* argv[]) { + +} + + From 87f48b5bc4d275027c2f8a62b392dd1dc25a4735 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 1 May 2013 15:40:31 -0700 Subject: [PATCH 2/7] add a PariableDevice struct that will hold device info in vector --- pairing-server/src/main.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index bfbed4ed88..729946527b 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -6,8 +6,34 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // +#include +#include + +#include + +const int PAIRING_SERVER_LISTEN_PORT = 52934; +const int MAX_PACKET_SIZE_BYTES = 1400; + +struct PairableDevice { + char identifier[64]; + char name[64]; + sockaddr localSocket; +}; + int main(int argc, const char* argv[]) { + UDPSocket serverSocket(PAIRING_SERVER_LISTEN_PORT); + sockaddr deviceAddress; + char deviceData[MAX_PACKET_SIZE_BYTES] = {}; + ssize_t receivedBytes = 0; + + std::vector devices; + + while (true) { + if (serverSocket.receive(&deviceAddress, &deviceData, &receivedBytes)) { + + } + } } From 905064239012bad8b1f312bf8569d48d846f4737 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 May 2013 16:11:34 -0700 Subject: [PATCH 3/7] add pairing device to vector after creation --- pairing-server/src/main.cpp | 43 +++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index 729946527b..0586bb9411 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -10,6 +10,7 @@ #include #include +#include const int PAIRING_SERVER_LISTEN_PORT = 52934; const int MAX_PACKET_SIZE_BYTES = 1400; @@ -17,9 +18,19 @@ const int MAX_PACKET_SIZE_BYTES = 1400; struct PairableDevice { char identifier[64]; char name[64]; - sockaddr localSocket; + sockaddr_in localSocket; }; +int indexOfFirstOccurenceOfCharacter(char* haystack, char needle) { + int currentIndex = 0; + + while (haystack[currentIndex] != '\0' && haystack[currentIndex] != needle) { + currentIndex++; + } + + return currentIndex; +} + int main(int argc, const char* argv[]) { UDPSocket serverSocket(PAIRING_SERVER_LISTEN_PORT); @@ -31,9 +42,33 @@ int main(int argc, const char* argv[]) { while (true) { if (serverSocket.receive(&deviceAddress, &deviceData, &receivedBytes)) { + // create a new PairableDevice + PairableDevice newDevice = {}; + int addressBytes[4]; + int socketPort = 0; + + sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", + newDevice.identifier, + &addressBytes[3], + &addressBytes[2], + &addressBytes[1], + &addressBytes[0], + &socketPort, + newDevice.name); + + // setup the localSocket for the pairing device + newDevice.localSocket.sin_family = AF_INET; + newDevice.localSocket.sin_addr.s_addr = (addressBytes[3] | + addressBytes[2] << 8 | + addressBytes[1] << 16 | + addressBytes[0] << 24); + newDevice.localSocket.sin_port = socketPort; + + // push this new device into the vector + printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); + devices.push_back(newDevice); } } -} - - + +} \ No newline at end of file From e5cd66313a68634d20e9ac670f4c0a5400295ce9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 May 2013 16:28:19 -0700 Subject: [PATCH 4/7] check the number of sscanf matches, store sending socket for device to reply --- pairing-server/src/main.cpp | 50 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index 0586bb9411..4383efe1ad 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -18,6 +18,7 @@ const int MAX_PACKET_SIZE_BYTES = 1400; struct PairableDevice { char identifier[64]; char name[64]; + sockaddr_in sendingSocket; sockaddr_in localSocket; }; @@ -34,40 +35,47 @@ int indexOfFirstOccurenceOfCharacter(char* haystack, char needle) { int main(int argc, const char* argv[]) { UDPSocket serverSocket(PAIRING_SERVER_LISTEN_PORT); - sockaddr deviceAddress; + sockaddr_in deviceAddress; char deviceData[MAX_PACKET_SIZE_BYTES] = {}; ssize_t receivedBytes = 0; std::vector devices; while (true) { - if (serverSocket.receive(&deviceAddress, &deviceData, &receivedBytes)) { + if (serverSocket.receive((sockaddr *)&deviceAddress, &deviceData, &receivedBytes)) { // create a new PairableDevice PairableDevice newDevice = {}; int addressBytes[4]; int socketPort = 0; - sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", - newDevice.identifier, - &addressBytes[3], - &addressBytes[2], - &addressBytes[1], - &addressBytes[0], - &socketPort, - newDevice.name); + int numMatches = sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", + newDevice.identifier, + &addressBytes[3], + &addressBytes[2], + &addressBytes[1], + &addressBytes[0], + &socketPort, + newDevice.name); - // setup the localSocket for the pairing device - newDevice.localSocket.sin_family = AF_INET; - newDevice.localSocket.sin_addr.s_addr = (addressBytes[3] | - addressBytes[2] << 8 | - addressBytes[1] << 16 | - addressBytes[0] << 24); - newDevice.localSocket.sin_port = socketPort; - - // push this new device into the vector - printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); - devices.push_back(newDevice); + if (numMatches >= 6) { + // if we have fewer than 6 matches the packet wasn't properly formatted + + // setup the localSocket for the pairing device + newDevice.localSocket.sin_family = AF_INET; + newDevice.localSocket.sin_addr.s_addr = (addressBytes[3] | + addressBytes[2] << 8 | + addressBytes[1] << 16 | + addressBytes[0] << 24); + newDevice.localSocket.sin_port = socketPort; + + // store this device's sending socket so we can talk back to it + newDevice.sendingSocket = deviceAddress; + + // push this new device into the vector + printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); + devices.push_back(newDevice); + } } } From dea203820070bcde6e7a3b7439a364011a4cfe88 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 2 May 2013 17:00:39 -0700 Subject: [PATCH 5/7] send the address and socket of device requesting pair to last available --- pairing-server/src/main.cpp | 77 ++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index 4383efe1ad..d869170344 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -35,46 +35,63 @@ int indexOfFirstOccurenceOfCharacter(char* haystack, char needle) { int main(int argc, const char* argv[]) { UDPSocket serverSocket(PAIRING_SERVER_LISTEN_PORT); - sockaddr_in deviceAddress; + sockaddr_in senderSocket; char deviceData[MAX_PACKET_SIZE_BYTES] = {}; ssize_t receivedBytes = 0; std::vector devices; while (true) { - if (serverSocket.receive((sockaddr *)&deviceAddress, &deviceData, &receivedBytes)) { - // create a new PairableDevice - PairableDevice newDevice = {}; + if (serverSocket.receive((sockaddr *)&senderSocket, &deviceData, &receivedBytes)) { - int addressBytes[4]; - int socketPort = 0; - - int numMatches = sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", - newDevice.identifier, - &addressBytes[3], - &addressBytes[2], - &addressBytes[1], - &addressBytes[0], - &socketPort, - newDevice.name); - - if (numMatches >= 6) { - // if we have fewer than 6 matches the packet wasn't properly formatted + if (deviceData[0] == 'A') { + // this is a device reporting itself as available - // setup the localSocket for the pairing device - newDevice.localSocket.sin_family = AF_INET; - newDevice.localSocket.sin_addr.s_addr = (addressBytes[3] | - addressBytes[2] << 8 | - addressBytes[1] << 16 | - addressBytes[0] << 24); - newDevice.localSocket.sin_port = socketPort; + // create a new PairableDevice + PairableDevice newDevice = {}; - // store this device's sending socket so we can talk back to it - newDevice.sendingSocket = deviceAddress; + int addressBytes[4]; + int socketPort = 0; - // push this new device into the vector - printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); - devices.push_back(newDevice); + int numMatches = sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", + newDevice.identifier, + &addressBytes[3], + &addressBytes[2], + &addressBytes[1], + &addressBytes[0], + &socketPort, + newDevice.name); + + if (numMatches >= 6) { + // if we have fewer than 6 matches the packet wasn't properly formatted + + // setup the localSocket for the pairing device + newDevice.localSocket.sin_family = AF_INET; + newDevice.localSocket.sin_addr.s_addr = (addressBytes[3] | + addressBytes[2] << 8 | + addressBytes[1] << 16 | + addressBytes[0] << 24); + newDevice.localSocket.sin_port = socketPort; + + // store this device's sending socket so we can talk back to it + newDevice.sendingSocket = senderSocket; + + // push this new device into the vector + printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); + devices.push_back(newDevice); + } + } else if (deviceData[0] == 'P') { + // this is a client looking to pair with a device + // send the most recent device this address so it can attempt to pair + + char requestorSocketString[INET_ADDRSTRLEN + 6] = {}; + char requestorAddress[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &(senderSocket.sin_addr), requestorAddress, INET_ADDRSTRLEN); + + sprintf(requestorSocketString, "%s:%d", requestorAddress, ntohs(senderSocket.sin_port)); + + PairableDevice lastDevice = devices[devices.size() - 1]; + serverSocket.send((sockaddr*) &lastDevice.sendingSocket, requestorSocketString, strlen(requestorSocketString)); } } } From bd6f0d9885054862c62b1a9497853a1ee495fa5b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 3 May 2013 10:58:57 -0700 Subject: [PATCH 6/7] couple of line deletions --- interface/src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 08b1666d05..2473c43380 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1593,8 +1593,6 @@ void mouseoverFunc( int x, int y) {} } - - void attachNewHeadToAgent(Agent *newAgent) { if (newAgent->getLinkedData() == NULL) { newAgent->setLinkedData(new Avatar(false)); From d0444ee5b7dbf8628716109f9f8249dca51f65c2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 3 May 2013 12:22:20 -0700 Subject: [PATCH 7/7] accept a local address and port from requestor --- pairing-server/src/main.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/pairing-server/src/main.cpp b/pairing-server/src/main.cpp index d869170344..2b2e416e66 100644 --- a/pairing-server/src/main.cpp +++ b/pairing-server/src/main.cpp @@ -36,15 +36,15 @@ int main(int argc, const char* argv[]) { UDPSocket serverSocket(PAIRING_SERVER_LISTEN_PORT); sockaddr_in senderSocket; - char deviceData[MAX_PACKET_SIZE_BYTES] = {}; + char senderData[MAX_PACKET_SIZE_BYTES] = {}; ssize_t receivedBytes = 0; std::vector devices; while (true) { - if (serverSocket.receive((sockaddr *)&senderSocket, &deviceData, &receivedBytes)) { + if (serverSocket.receive((sockaddr *)&senderSocket, &senderData, &receivedBytes)) { - if (deviceData[0] == 'A') { + if (senderData[0] == 'A') { // this is a device reporting itself as available // create a new PairableDevice @@ -53,7 +53,7 @@ int main(int argc, const char* argv[]) { int addressBytes[4]; int socketPort = 0; - int numMatches = sscanf(deviceData, "A %s %d.%d.%d.%d:%d %s", + int numMatches = sscanf(senderData, "Available %s %d.%d.%d.%d:%d %s", newDevice.identifier, &addressBytes[3], &addressBytes[2], @@ -80,18 +80,23 @@ int main(int argc, const char* argv[]) { printf("Adding device %s (%s) to list\n", newDevice.identifier, newDevice.name); devices.push_back(newDevice); } - } else if (deviceData[0] == 'P') { + } else if (senderData[0] == 'F') { // this is a client looking to pair with a device // send the most recent device this address so it can attempt to pair - char requestorSocketString[INET_ADDRSTRLEN + 6] = {}; - char requestorAddress[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &(senderSocket.sin_addr), requestorAddress, INET_ADDRSTRLEN); + char requestorAddress[INET_ADDRSTRLEN] = {}; + int requestorPort = 0; - sprintf(requestorSocketString, "%s:%d", requestorAddress, ntohs(senderSocket.sin_port)); + int requestorMatches = sscanf(senderData, "Find %[^:]:%d", requestorAddress, &requestorPort); - PairableDevice lastDevice = devices[devices.size() - 1]; - serverSocket.send((sockaddr*) &lastDevice.sendingSocket, requestorSocketString, strlen(requestorSocketString)); + if (requestorMatches == 2) { + PairableDevice lastDevice = devices[devices.size() - 1]; + + char pairData[INET_ADDRSTRLEN + 6] = {}; + sprintf(pairData, "%s:%d", requestorAddress, requestorPort); + + serverSocket.send((sockaddr*) &lastDevice.sendingSocket, pairData, strlen(pairData)); + } } } }