This commit is contained in:
Philip Rosedale 2013-06-12 16:27:53 -07:00
commit 3d1ddf047e
6 changed files with 33 additions and 23 deletions

View file

@ -135,8 +135,8 @@ int main(int argc, const char * argv[])
if (numInterestTypes > 0) { if (numInterestTypes > 0) {
// if the agent has sent no types of interest, assume they want nothing but their own ID back // if the agent has sent no types of interest, assume they want nothing but their own ID back
for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType) if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType)) {
&& memchr(agentTypesOfInterest, agent->getType(), numInterestTypes)) { if (memchr(agentTypesOfInterest, agent->getType(), numInterestTypes)) {
// this is not the agent themselves // this is not the agent themselves
// and this is an agent of a type in the passed agent types of interest // and this is an agent of a type in the passed agent types of interest
// or the agent did not pass us any specific types they are interested in // or the agent did not pass us any specific types they are interested in
@ -156,6 +156,7 @@ int main(int argc, const char * argv[])
newestSoloAgents[agent->getType()] = &(*agent); newestSoloAgents[agent->getType()] = &(*agent);
} }
} }
}
} else { } else {
double timeNow = usecTimestampNow(); double timeNow = usecTimestampNow();

View file

@ -169,7 +169,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_window->setWindowTitle("Interface"); _window->setWindowTitle("Interface");
printLog("Interface Startup:\n"); printLog("Interface Startup:\n");
unsigned int listenPort = AGENT_SOCKET_LISTEN_PORT; unsigned int listenPort = 0; // bind to an ephemeral port by default
const char** constArgv = const_cast<const char**>(argv); const char** constArgv = const_cast<const char**>(argv);
const char* portStr = getCmdOption(argc, constArgv, "--listenPort"); const char* portStr = getCmdOption(argc, constArgv, "--listenPort");
if (portStr) { if (portStr) {
@ -829,6 +829,7 @@ void Application::terminate() {
static void sendAvatarVoxelURLMessage(const QUrl& url) { static void sendAvatarVoxelURLMessage(const QUrl& url) {
uint16_t ownerID = AgentList::getInstance()->getOwnerID(); uint16_t ownerID = AgentList::getInstance()->getOwnerID();
if (ownerID == UNKNOWN_AGENT_ID) { if (ownerID == UNKNOWN_AGENT_ID) {
return; // we don't yet know who we are return; // we don't yet know who we are
} }

View file

@ -62,7 +62,6 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) :
_agentSocket(newSocketListenPort), _agentSocket(newSocketListenPort),
_ownerType(newOwnerType), _ownerType(newOwnerType),
_agentTypesOfInterest(NULL), _agentTypesOfInterest(NULL),
_socketListenPort(newSocketListenPort),
_ownerID(UNKNOWN_AGENT_ID), _ownerID(UNKNOWN_AGENT_ID),
_lastAgentID(0) { _lastAgentID(0) {
pthread_mutex_init(&mutex, 0); pthread_mutex_init(&mutex, 0);
@ -224,7 +223,7 @@ void AgentList::sendDomainServerCheckIn() {
packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(AGENT_TYPE), packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(AGENT_TYPE),
getLocalAddress(), getLocalAddress(),
htons(_socketListenPort)); htons(_agentSocket.getListeningPort()));
// add the number of bytes for agent types of interest // add the number of bytes for agent types of interest
*(packetPosition++) = numBytesAgentsOfInterest; *(packetPosition++) = numBytesAgentsOfInterest;

View file

@ -58,7 +58,7 @@ public:
UDPSocket* getAgentSocket() { return &_agentSocket; } UDPSocket* getAgentSocket() { return &_agentSocket; }
unsigned int getSocketListenPort() const { return _socketListenPort; }; unsigned int getSocketListenPort() const { return _agentSocket.getListeningPort(); };
void(*linkedDataCreateCallback)(Agent *); void(*linkedDataCreateCallback)(Agent *);

View file

@ -117,7 +117,7 @@ unsigned short loadBufferWithSocketInfo(char* addressBuffer, sockaddr* socket) {
} }
} }
UDPSocket::UDPSocket(int listeningPort) : blocking(true) { UDPSocket::UDPSocket(int listeningPort) : listeningPort(listeningPort), blocking(true) {
init(); init();
// create the socket // create the socket
handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
@ -140,6 +140,13 @@ UDPSocket::UDPSocket(int listeningPort) : blocking(true) {
return; return;
} }
// if we requested an ephemeral port, get the actual port
if (listeningPort == 0) {
socklen_t addressLength = sizeof(sockaddr_in);
getsockname(handle, (sockaddr*) &bind_address, &addressLength);
listeningPort = ntohs(bind_address.sin_port);
}
// set timeout on socket recieve to 0.5 seconds // set timeout on socket recieve to 0.5 seconds
struct timeval tv; struct timeval tv;
tv.tv_sec = 0; tv.tv_sec = 0;

View file

@ -23,14 +23,16 @@ public:
UDPSocket(int listening_port); UDPSocket(int listening_port);
~UDPSocket(); ~UDPSocket();
bool init(); bool init();
int getListeningPort() const { return listeningPort; }
void setBlocking(bool blocking); void setBlocking(bool blocking);
bool isBlocking() { return blocking; } bool isBlocking() const { return blocking; }
int send(sockaddr* destAddress, const void* data, size_t byteLength) const; int send(sockaddr* destAddress, const void* data, size_t byteLength) const;
int send(char* destAddress, int destPort, const void* data, size_t byteLength) const; int send(char* destAddress, int destPort, const void* data, size_t byteLength) const;
bool receive(void* receivedData, ssize_t* receivedBytes) const; bool receive(void* receivedData, ssize_t* receivedBytes) const;
bool receive(sockaddr* recvAddress, void* receivedData, ssize_t* receivedBytes) const; bool receive(sockaddr* recvAddress, void* receivedData, ssize_t* receivedBytes) const;
private: private:
int handle; int handle;
int listeningPort;
bool blocking; bool blocking;
}; };