mirror of
https://github.com/lubosz/overte.git
synced 2025-04-24 18:23:22 +02:00
This should help, as well as fix another annoyance: bind to an ephemeral port,
rather than a fixed one.
This commit is contained in:
parent
f197b4cd62
commit
e4ed9162b9
5 changed files with 14 additions and 10 deletions
|
@ -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) {
|
||||
|
@ -827,8 +827,6 @@ void Application::terminate() {
|
|||
static void sendAvatarVoxelURLMessage(const QUrl& url) {
|
||||
uint16_t ownerID = AgentList::getInstance()->getOwnerID();
|
||||
|
||||
qDebug() << "me" << ownerID << url;
|
||||
|
||||
if (ownerID == UNKNOWN_AGENT_ID) {
|
||||
return; // we don't yet know who we are
|
||||
}
|
||||
|
@ -850,8 +848,6 @@ static void processAvatarVoxelURLMessage(unsigned char *packetData, size_t dataB
|
|||
packetData += sizeof(agentID);
|
||||
dataBytes -= sizeof(agentID);
|
||||
|
||||
qDebug() << "them" << agentID << QUrl::fromEncoded(QByteArray((char*)packetData, dataBytes));
|
||||
|
||||
// make sure the agent exists
|
||||
Agent* agent = AgentList::getInstance()->agentWithID(agentID);
|
||||
if (!agent || !agent->getLinkedData()) {
|
||||
|
|
|
@ -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) : blocking(true), listeningPort(listeningPort) {
|
||||
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