From 5daf15ac2d809de202a9b322080ab5ab66f1c68d Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 21 Nov 2012 11:12:40 -0800 Subject: [PATCH] Spaceserver agent list, broadcast routines for discovered agents --- agent.cpp | 80 ++++++++++++++++++ agent.h | 23 +++++ interface.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 101676 -> 103122 bytes main.cpp | 11 +-- network.cpp | 9 +- network.h | 7 ++ 7 files changed, 123 insertions(+), 13 deletions(-) create mode 100644 agent.cpp create mode 100644 agent.h diff --git a/agent.cpp b/agent.cpp new file mode 100644 index 0000000000..f0f3fe9bc9 --- /dev/null +++ b/agent.cpp @@ -0,0 +1,80 @@ +// +// agent.cpp +// interface +// +// Created by Philip Rosedale on 11/20/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#include +#include "agent.h" + +// Structure to hold references to other agents that are nearby + +const int MAX_AGENTS = 100; +struct AgentList { + in_addr sin_addr; + glm::vec3 position; +} agents[MAX_AGENTS]; +int num_agents = 0; + +// Process an incoming packet that lists the other agents in the area +void update_agents(char * data, int length) { + std::string packet(data, length); + //std::string packet("127.0.0.1,"); + //std::cout << " Update Agents, string: " << packet << "\n"; + size_t spot; + size_t start_spot = 0; + spot = packet.find_first_of (",", 0); + while (spot != std::string::npos) { + std::string IPstring = packet.substr(start_spot, spot-start_spot); + //std::cout << "Found " << num_agents << + //" with IP " << IPstring << " from " << start_spot << " to " << spot << "\n"; + // Add the IP address to the agent table + add_agent(&IPstring); + start_spot = spot + 1; + if (start_spot < packet.length()) + spot = packet.find_first_of (",", start_spot); + else spot = std::string::npos; + } +} + +int add_agent(std::string * IP) { + in_addr_t addr = inet_addr(IP->c_str()); + //std::cout << "Checking for " << IP->c_str() << " "; + for (int i = 0; i < num_agents; i++) { + if (agents[i].sin_addr.s_addr == addr) { + //std::cout << "Found!\n"; + return 0; + } + } + if (num_agents < MAX_AGENTS) { + agents[num_agents].sin_addr.s_addr = addr; + std::cout << "Added Agent # " << num_agents << " with IP " << + inet_ntoa(agents[num_agents].sin_addr) << "\n"; + num_agents++; + return 1; + } else { + std::cout << "Max agents reached!\n"; + return 0; + } +} + +// Broadcast data to all the other agents you are aware of, returns 1 for success +int broadcast(int handle, char * data, int length) { + sockaddr_in dest_address; + dest_address.sin_family = AF_INET; + dest_address.sin_port = htons( (unsigned short) UDP_PORT ); + + int sent_bytes; + for (int i = 0; i < num_agents; i++) { + dest_address.sin_addr.s_addr = agents[i].sin_addr.s_addr; + sent_bytes = sendto( handle, (const char*)data, length, + 0, (sockaddr*)&dest_address, sizeof(sockaddr_in) ); + if (sent_bytes != length) { + std::cout << "Broadcast packet fail!\n"; + return 0; + } + } + return 1; +} diff --git a/agent.h b/agent.h new file mode 100644 index 0000000000..896b76923f --- /dev/null +++ b/agent.h @@ -0,0 +1,23 @@ +// +// agent.h +// interface +// +// Created by Philip Rosedale on 11/20/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef interface_agent_h +#define interface_agent_h + +#include "glm/glm.hpp" +#include +#include +#include +#include +#include +#include "network.h" + +void update_agents(char * data, int length); +int add_agent(std::string * IP); + +#endif diff --git a/interface.xcodeproj/project.pbxproj b/interface.xcodeproj/project.pbxproj index 910b2dbd70..18a6cffacf 100644 --- a/interface.xcodeproj/project.pbxproj +++ b/interface.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ B6BDADE415F44AC7002A07DF /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6BDADDC15F444D3002A07DF /* AudioUnit.framework */; }; B6BDAE4415F6BE53002A07DF /* particle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6BDAE4315F6BE53002A07DF /* particle.cpp */; }; D409B98A165849180099B0B3 /* cloud.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D409B989165849180099B0B3 /* cloud.cpp */; }; + D409B9A8165CA7BC0099B0B3 /* agent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D409B9A7165CA7BB0099B0B3 /* agent.cpp */; }; D40BDFD513404BA300B0BE1F /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D40BDFD413404BA300B0BE1F /* GLUT.framework */; }; D40BDFD713404BB300B0BE1F /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D40BDFD613404BB300B0BE1F /* OpenGL.framework */; }; D40FD5FB164AF1C200878184 /* int-texture256-v2.png in CopyFiles */ = {isa = PBXBuildFile; fileRef = D40FD5FA164AF1A700878184 /* int-texture256-v2.png */; }; @@ -69,6 +70,8 @@ C6859E8B029090EE04C91782 /* test_c_plus.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = test_c_plus.1; sourceTree = ""; }; D409B988165849030099B0B3 /* cloud.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cloud.h; sourceTree = ""; }; D409B989165849180099B0B3 /* cloud.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cloud.cpp; sourceTree = ""; }; + D409B9A6165CA7A50099B0B3 /* agent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = agent.h; sourceTree = ""; }; + D409B9A7165CA7BB0099B0B3 /* agent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = agent.cpp; sourceTree = ""; }; D40BDFD413404BA300B0BE1F /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = ""; }; D40BDFD613404BB300B0BE1F /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; D40FD5FA164AF1A700878184 /* int-texture256-v2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "int-texture256-v2.png"; sourceTree = SOURCE_ROOT; }; @@ -137,6 +140,8 @@ isa = PBXGroup; children = ( 08FB7796FE84155DC02AAC07 /* main.cpp */, + D409B9A6165CA7A50099B0B3 /* agent.h */, + D409B9A7165CA7BB0099B0B3 /* agent.cpp */, D409B988165849030099B0B3 /* cloud.h */, D409B989165849180099B0B3 /* cloud.cpp */, D4EE3BC015E746E900EE4C89 /* world.h */, @@ -267,6 +272,7 @@ F68135561648617D003040E3 /* texture.cpp in Sources */, F681358B1648896D003040E3 /* lodepng.cpp in Sources */, D409B98A165849180099B0B3 /* cloud.cpp in Sources */, + D409B9A8165CA7BC0099B0B3 /* agent.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index b310c1ec8998fae6553ee58651446f823ff07bac..13077bb321daeb9cbaa5b117160f46a4a44ffeb5 100644 GIT binary patch delta 39108 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 delta 37991 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

#O@m(Zq1WZm>j~)f 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 diff --git a/main.cpp b/main.cpp index bafb5383c1..9f4d612058 100644 --- a/main.cpp +++ b/main.cpp @@ -45,10 +45,10 @@ #include "head.h" #include "hand.h" #include "particle.h" - #include "texture.h" - #include "cloud.h" +#include "agent.h" + //TGAImg Img; @@ -100,7 +100,6 @@ Cloud cloud(300000, // Particles false // Wrap ); - #define RENDER_FRAME_MSECS 10 #define SLEEP 0 @@ -201,6 +200,7 @@ void Timer(int extra) // Send a message to the spaceserver telling it we are ALIVE notify_spaceserver(UDP_socket, location[0], location[1], location[2]); + } void display_stats(void) @@ -650,8 +650,9 @@ void read_network() ping_msecs = (float)diffclock(ping_start, check); } else if (incoming_packet[0] == 'S') { // Message from Spaceserver - std::cout << "Spaceserver: "; - outstring(incoming_packet, bytes_recvd); + //std::cout << "Spaceserver: "; + //outstring(incoming_packet, bytes_recvd); + update_agents(&incoming_packet[1], bytes_recvd - 1); } } } diff --git a/network.cpp b/network.cpp index def6845057..e386ac913d 100644 --- a/network.cpp +++ b/network.cpp @@ -11,13 +11,6 @@ #include "network.h" -const int UDP_PORT = 30001; -const char DESTINATION_IP[] = "127.0.0.1"; - -// Location of the spaceserver to talk to -const char SPACESERVER_IP[] = "127.0.0.1"; -const int SPACESERVER_PORT = 40000; - // Implementation of optional delay behavior using a ring buffer const int MAX_DELAY_PACKETS = 300; char delay_buffer[MAX_PACKET_SIZE*MAX_DELAY_PACKETS]; @@ -97,7 +90,7 @@ timeval network_send_ping(int handle) { int notify_spaceserver(int handle, float x, float y, float z) { char data[100]; sprintf(data, "%f,%f,%f", x, y, z); - std::cout << "sending: " << data << "\n"; + //std::cout << "sending: " << data << "\n"; int packet_size = strlen(data); int sent_bytes = sendto( handle, (const char*)data, packet_size, 0, (sockaddr*)&spaceserver_address, sizeof(sockaddr_in) ); diff --git a/network.h b/network.h index 751b8f0f87..e06f416b9e 100644 --- a/network.h +++ b/network.h @@ -16,7 +16,14 @@ #include #include "util.h" +// Port to use for communicating UDP with other nearby agents const int MAX_PACKET_SIZE = 1500; +const int UDP_PORT = 30001; +const char DESTINATION_IP[] = "127.0.0.1"; + +// Address and port of spaceserver process to advertise other agents +const char SPACESERVER_IP[] = "127.0.0.1"; +const int SPACESERVER_PORT = 40000; int network_init(); int network_send(int handle, char * packet_data, int packet_size);