mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 13:03:55 +02:00
Merge pull request #531 from ey6es/master
Fixed bug with packet type filtering, have client bind to an ephemeral port by default so that we can run multiple clients without having to manually specify ports.
This commit is contained in:
commit
26a8607334
6 changed files with 33 additions and 23 deletions
|
@ -135,25 +135,26 @@ int main(int argc, const char * argv[])
|
|||
if (numInterestTypes > 0) {
|
||||
// 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++) {
|
||||
if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType)
|
||||
&& memchr(agentTypesOfInterest, agent->getType(), numInterestTypes)) {
|
||||
// this is not the agent themselves
|
||||
// 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
|
||||
if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType)) {
|
||||
if (memchr(agentTypesOfInterest, agent->getType(), numInterestTypes)) {
|
||||
// this is not the agent themselves
|
||||
// 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
|
||||
|
||||
if (memchr(SOLO_AGENT_TYPES, agent->getType(), sizeof(SOLO_AGENT_TYPES)) == NULL) {
|
||||
// this is an agent of which there can be multiple, just add them to the packet
|
||||
// don't send avatar agents to other avatars, that will come from avatar mixer
|
||||
if (agentType != AGENT_TYPE_AVATAR || agent->getType() != AGENT_TYPE_AVATAR) {
|
||||
currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, &(*agent));
|
||||
}
|
||||
if (memchr(SOLO_AGENT_TYPES, agent->getType(), sizeof(SOLO_AGENT_TYPES)) == NULL) {
|
||||
// this is an agent of which there can be multiple, just add them to the packet
|
||||
// don't send avatar agents to other avatars, that will come from avatar mixer
|
||||
if (agentType != AGENT_TYPE_AVATAR || agent->getType() != AGENT_TYPE_AVATAR) {
|
||||
currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, &(*agent));
|
||||
}
|
||||
|
||||
} else {
|
||||
// solo agent, we need to only send newest
|
||||
if (newestSoloAgents[agent->getType()] == NULL ||
|
||||
newestSoloAgents[agent->getType()]->getWakeMicrostamp() < agent->getWakeMicrostamp()) {
|
||||
// we have to set the newer solo agent to add it to the broadcast later
|
||||
newestSoloAgents[agent->getType()] = &(*agent);
|
||||
} else {
|
||||
// solo agent, we need to only send newest
|
||||
if (newestSoloAgents[agent->getType()] == NULL ||
|
||||
newestSoloAgents[agent->getType()]->getWakeMicrostamp() < agent->getWakeMicrostamp()) {
|
||||
// we have to set the newer solo agent to add it to the broadcast later
|
||||
newestSoloAgents[agent->getType()] = &(*agent);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -169,7 +169,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
|
|||
_window->setWindowTitle("Interface");
|
||||
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* portStr = getCmdOption(argc, constArgv, "--listenPort");
|
||||
if (portStr) {
|
||||
|
@ -826,6 +826,7 @@ void Application::terminate() {
|
|||
|
||||
static void sendAvatarVoxelURLMessage(const QUrl& url) {
|
||||
uint16_t ownerID = AgentList::getInstance()->getOwnerID();
|
||||
|
||||
if (ownerID == UNKNOWN_AGENT_ID) {
|
||||
return; // we don't yet know who we are
|
||||
}
|
||||
|
|
|
@ -62,7 +62,6 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) :
|
|||
_agentSocket(newSocketListenPort),
|
||||
_ownerType(newOwnerType),
|
||||
_agentTypesOfInterest(NULL),
|
||||
_socketListenPort(newSocketListenPort),
|
||||
_ownerID(UNKNOWN_AGENT_ID),
|
||||
_lastAgentID(0) {
|
||||
pthread_mutex_init(&mutex, 0);
|
||||
|
@ -224,7 +223,7 @@ void AgentList::sendDomainServerCheckIn() {
|
|||
|
||||
packetPosition += packSocket(checkInPacket + sizeof(PACKET_HEADER) + sizeof(AGENT_TYPE),
|
||||
getLocalAddress(),
|
||||
htons(_socketListenPort));
|
||||
htons(_agentSocket.getListeningPort()));
|
||||
|
||||
// add the number of bytes for agent types of interest
|
||||
*(packetPosition++) = numBytesAgentsOfInterest;
|
||||
|
|
|
@ -58,7 +58,7 @@ public:
|
|||
|
||||
UDPSocket* getAgentSocket() { return &_agentSocket; }
|
||||
|
||||
unsigned int getSocketListenPort() const { return _socketListenPort; };
|
||||
unsigned int getSocketListenPort() const { return _agentSocket.getListeningPort(); };
|
||||
|
||||
void(*linkedDataCreateCallback)(Agent *);
|
||||
|
||||
|
|
|
@ -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();
|
||||
// create the socket
|
||||
handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
|
@ -140,6 +140,13 @@ UDPSocket::UDPSocket(int listeningPort) : blocking(true) {
|
|||
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
|
||||
struct timeval tv;
|
||||
tv.tv_sec = 0;
|
||||
|
|
|
@ -23,14 +23,16 @@ public:
|
|||
UDPSocket(int listening_port);
|
||||
~UDPSocket();
|
||||
bool init();
|
||||
int getListeningPort() const { return listeningPort; }
|
||||
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(char* destAddress, int destPort, const void* data, size_t byteLength) const;
|
||||
bool receive(void* receivedData, ssize_t* receivedBytes) const;
|
||||
bool receive(sockaddr* recvAddress, void* receivedData, ssize_t* receivedBytes) const;
|
||||
private:
|
||||
int handle;
|
||||
int listeningPort;
|
||||
bool blocking;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue