From da8fd5f4ee72c84404bd38764c32134c099c52b1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 14 Feb 2013 16:45:00 -0800 Subject: [PATCH] hook space server up to shared UDPSocket class --- LinkHifiShared.cmake | 1 + interface/src/Audio.cpp | 4 +-- interface/src/main.cpp | 10 ++++---- mixer/src/main.cpp | 2 +- shared/src/UDPSocket.cpp | 22 +++++++++------- shared/src/UDPSocket.h | 7 +++--- space/CMakeLists.txt | 3 +++ space/src/main.cpp | 54 ++++++---------------------------------- 8 files changed, 37 insertions(+), 66 deletions(-) diff --git a/LinkHifiShared.cmake b/LinkHifiShared.cmake index 4866be6ed0..de6f0875ef 100644 --- a/LinkHifiShared.cmake +++ b/LinkHifiShared.cmake @@ -5,5 +5,6 @@ MACRO(LINK_HIFI_SHARED_LIBRARY TARGET) include_directories(../shared/src) get_directory_property(HIFI_SHARED_LIBRARY DIRECTORY ../shared DEFINITION HIFI_SHARED_LIBRARY) + add_dependencies(${TARGET} ${HIFI_SHARED_LIBRARY}) target_link_libraries(${TARGET} ${HIFI_SHARED_LIBRARY}) ENDMACRO(LINK_HIFI_SHARED_LIBRARY _target) \ No newline at end of file diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index f559b806d2..eaaaef9b10 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -182,7 +182,7 @@ void *receiveAudioViaUDP(void *args) { AudioData *sharedAudioData = threadArgs->sharedAudioData; int16_t *receivedData = new int16_t[BUFFER_LENGTH_SAMPLES]; - int *receivedBytes = new int; + ssize_t receivedBytes; timeval previousReceiveTime, currentReceiveTime = {}; @@ -204,7 +204,7 @@ void *receiveAudioViaUDP(void *args) { } while (true) { - if (sharedAudioData->audioSocket->receive((void *)receivedData, receivedBytes)) { + if (sharedAudioData->audioSocket->receive((void *)receivedData, &receivedBytes)) { bool firstSample = (currentReceiveTime.tv_sec == 0); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index fcf424cc0b..4fa17fc42f 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -764,12 +764,12 @@ void key(unsigned char k, int x, int y) void *networkReceive(void *args) { sockaddr_in senderAddress; - int bytesRecvd; + ssize_t bytesReceived; while (true) { - if (agentSocket.receive(&senderAddress, (void *)incomingPacket, &bytesRecvd)) { + if (agentSocket.receive(&senderAddress, (void *)incomingPacket, &bytesReceived)) { packetcount++; - bytescount += bytesRecvd; + bytescount += bytesReceived; // If packet is a Mouse data packet, copy it over if (incomingPacket[0] == 'P') { // @@ -796,14 +796,14 @@ void *networkReceive(void *args) // Message from domainserver // //printf("agent list received!\n"); - nearbyAgents = update_agents(&incomingPacket[1], bytesRecvd - 1); + nearbyAgents = update_agents(&incomingPacket[1], bytesReceived - 1); kludgyMixerUpdate(audio); } else if (incomingPacket[0] == 'H') { // // Broadcast packet from another agent // //printf("broadcast received"); - update_agent(inet_ntoa(senderAddress.sin_addr), ntohs(senderAddress.sin_port), &incomingPacket[1], bytesRecvd - 1); + update_agent(inet_ntoa(senderAddress.sin_addr), ntohs(senderAddress.sin_port), &incomingPacket[1], bytesReceived - 1); } else if (incomingPacket[0] == 'T') { // Received a self-test packet (to get one's own IP), copy it to local variable! printf("My Address: %s:%u\n", diff --git a/mixer/src/main.cpp b/mixer/src/main.cpp index 45c9e2d93b..f3403204f6 100644 --- a/mixer/src/main.cpp +++ b/mixer/src/main.cpp @@ -248,7 +248,7 @@ void *reportAliveToDS(void *args) { int main(int argc, const char * argv[]) { timeval lastAgentUpdate; - int receivedBytes = 0; + ssize_t receivedBytes = 0; // Lookup the IP address of things we have hostnames printf("need to look this one up\n"); diff --git a/shared/src/UDPSocket.cpp b/shared/src/UDPSocket.cpp index dfb80e8c63..1d48d0338e 100644 --- a/shared/src/UDPSocket.cpp +++ b/shared/src/UDPSocket.cpp @@ -48,13 +48,13 @@ UDPSocket::~UDPSocket() { } // Receive data on this socket with retrieving address of sender -bool UDPSocket::receive(void *receivedData, int *receivedBytes) { +bool UDPSocket::receive(void *receivedData, ssize_t *receivedBytes) { return receive(&senderAddress, receivedData, receivedBytes); } // Receive data on this socket with the address of the sender -bool UDPSocket::receive(sockaddr_in *recvAddress, void *receivedData, int *receivedBytes) { +bool UDPSocket::receive(sockaddr_in *recvAddress, void *receivedData, ssize_t *receivedBytes) { socklen_t addressSize = sizeof(&recvAddress); @@ -64,15 +64,10 @@ bool UDPSocket::receive(sockaddr_in *recvAddress, void *receivedData, int *recei return (*receivedBytes > 0); } -int UDPSocket::send(char * destAddress, int destPort, const void *data, int byteLength) { - - // change address and port on reusable global to passed variables - destSockaddr.sin_addr.s_addr = inet_addr(destAddress); - destSockaddr.sin_port = htons((uint16_t)destPort); - +int UDPSocket::send(sockaddr_in *destAddress, const void *data, size_t byteLength) { // send data via UDP int sent_bytes = sendto(handle, (const char*)data, byteLength, - 0, (sockaddr *)&destSockaddr, sizeof(sockaddr_in)); + 0, (sockaddr *)&destSockaddr, sizeof(sockaddr_in)); if (sent_bytes != byteLength) { printf("Failed to send packet: return value = %d\n", sent_bytes); @@ -81,3 +76,12 @@ int UDPSocket::send(char * destAddress, int destPort, const void *data, int byte return sent_bytes; } + +int UDPSocket::send(char * destAddress, int destPort, const void *data, size_t byteLength) { + + // change address and port on reusable global to passed variables + destSockaddr.sin_addr.s_addr = inet_addr(destAddress); + destSockaddr.sin_port = htons((uint16_t)destPort); + + return send(&destSockaddr, data, byteLength); +} diff --git a/shared/src/UDPSocket.h b/shared/src/UDPSocket.h index a559b8d847..7acd6511d2 100644 --- a/shared/src/UDPSocket.h +++ b/shared/src/UDPSocket.h @@ -19,9 +19,10 @@ class UDPSocket { public: UDPSocket(int listening_port); ~UDPSocket(); - int send(char *destAddress, int destPort, const void *data, int byteLength); - bool receive(void *receivedData, int *receivedBytes); - bool receive(sockaddr_in *recvAddress, void *receivedData, int *receivedBytes); + int send(sockaddr_in *destAddress, const void *data, size_t byteLength); + int send(char *destAddress, int destPort, const void *data, size_t byteLength); + bool receive(void *receivedData, ssize_t *receivedBytes); + bool receive(sockaddr_in *recvAddress, void *receivedData, ssize_t *receivedBytes); private: int handle; diff --git a/space/CMakeLists.txt b/space/CMakeLists.txt index a1e60173a3..0cd910a42f 100644 --- a/space/CMakeLists.txt +++ b/space/CMakeLists.txt @@ -5,3 +5,6 @@ project(space) file(GLOB SPACE_SRCS src/*.cpp src/*.h) add_executable(space ${SPACE_SRCS}) + +include(../LinkHifiShared.cmake) +link_hifi_shared_library(space) \ No newline at end of file diff --git a/space/src/main.cpp b/space/src/main.cpp index 1e71592105..90b897a0b9 100644 --- a/space/src/main.cpp +++ b/space/src/main.cpp @@ -25,9 +25,10 @@ #include #include #include "TreeNode.h" +#include "UDPSocket.h" const char *CONFIG_FILE = "/etc/below92/spaceserver.data.txt"; -const int UDP_PORT = 55551; +const int SPACE_LISTENING_PORT = 55551; std::vector< std::vector > configData; sockaddr_in address, destAddress; socklen_t destLength = sizeof(destAddress); @@ -36,45 +37,16 @@ std::string ROOT_HOSTNAME = "root.highfidelity.co"; std::string ROOT_NICKNAME = "root"; std::string *LAST_KNOWN_HOSTNAME = new std::string(); -const short PACKET_LENGTH_BYTES = 1024; +const size_t PACKET_LENGTH_BYTES = 1024; TreeNode rootNode; +UDPSocket spaceSocket(SPACE_LISTENING_PORT); void printBinaryValue(char element) { std::bitset<8> x(element); std::cout << "Printing binary value: " << x << std::endl; } -int create_socket() -{ - // Create socket - int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - - if (handle <= 0) { - printf("Failed to create socket: %d\n", handle); - return false; - } - - return handle; -} - -int network_init() -{ - int handle = create_socket(); - - // Bind socket to port - address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = htons( (unsigned short) UDP_PORT ); - - if (bind(handle, (const sockaddr*) &address, sizeof(sockaddr_in)) < 0) { - printf( "failed to bind socket\n" ); - return false; - } - - return handle; -} - TreeNode *findOrCreateNode(unsigned long lengthInBits, unsigned char *addressBytes, std::string *hostname, @@ -189,16 +161,9 @@ bool loadSpaceData(void) { } int main (int argc, const char *argv[]) { - int handle = network_init(); - unsigned char packetData[PACKET_LENGTH_BYTES]; - long received_bytes = 0; - if (!handle) { - std::cout << "[FATAL] Failed to create UDP listening socket" << std::endl; - return 0; - } else { - std::cout << "[DEBUG] Socket started" << std::endl; - } + unsigned char packetData[PACKET_LENGTH_BYTES]; + ssize_t receivedBytes = 0; rootNode.hostname = &ROOT_HOSTNAME; rootNode.nickname = &ROOT_NICKNAME; @@ -208,8 +173,7 @@ int main (int argc, const char *argv[]) { std::cout << "[DEBUG] Listening for Datagrams" << std::endl; while (true) { - received_bytes = recvfrom(handle, (unsigned char*)packetData, PACKET_LENGTH_BYTES, 0, (sockaddr*)&destAddress, &destLength); - if (received_bytes > 0) { + if (spaceSocket.receive(&destAddress, &packetData, &receivedBytes)) { unsigned long lengthInBits; lengthInBits = packetData[0] * 3; @@ -221,7 +185,6 @@ int main (int argc, const char *argv[]) { std::string thisNickname; std::string hostnameHolder; int domain_id = 0; - long sentBytes; TreeNode thisNode = *findOrCreateNode(lengthInBits, addressData, &thisHostname, &thisNickname, domain_id); @@ -235,8 +198,7 @@ int main (int argc, const char *argv[]) { std::copy(hostnameHolder.begin(), hostnameHolder.end(), hostname); hostname[hostnameHolder.size()] = '\0'; - sentBytes = sendto(handle, &hostname, PACKET_LENGTH_BYTES, - 0, (sockaddr*)&destAddress, sizeof(destAddress)); + spaceSocket.send(&destAddress, &hostname, PACKET_LENGTH_BYTES); } } }