mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-29 11:31:42 +02:00
add check for pending datagrams before read
This commit is contained in:
parent
6d04d0cee1
commit
49191826af
12 changed files with 41 additions and 32 deletions
|
@ -858,9 +858,10 @@ int main(int argc, const char * argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nodes sending messages to us...
|
// Nodes sending messages to us...
|
||||||
if ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
if (nodeList->getNodeSocket().hasPendingDatagrams()
|
||||||
nodeSockAddr.getAddressPointer(),
|
&& (receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
||||||
nodeSockAddr.getPortPointer())) &&
|
nodeSockAddr.getAddressPointer(),
|
||||||
|
nodeSockAddr.getPortPointer())) &&
|
||||||
packetVersionMatch(packetData)) {
|
packetVersionMatch(packetData)) {
|
||||||
|
|
||||||
if (packetData[0] == PACKET_TYPE_VOXEL_JURISDICTION) {
|
if (packetData[0] == PACKET_TYPE_VOXEL_JURISDICTION) {
|
||||||
|
|
|
@ -147,10 +147,11 @@ void Agent::run() {
|
||||||
qDebug() << "Uncaught exception at line" << line << ":" << engine.uncaughtException().toString() << "\n";
|
qDebug() << "Uncaught exception at line" << line << ":" << engine.uncaughtException().toString() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((receivedBytes = NodeList::getInstance()->getNodeSocket().readDatagram((char*) receivedBytes,
|
while (nodeList->getNodeSocket().hasPendingDatagrams() &&
|
||||||
MAX_PACKET_SIZE,
|
(receivedBytes = nodeList->getNodeSocket().readDatagram((char*) receivedBytes,
|
||||||
senderSockAddr.getAddressPointer(),
|
MAX_PACKET_SIZE,
|
||||||
senderSockAddr.getPortPointer()))
|
senderSockAddr.getAddressPointer(),
|
||||||
|
senderSockAddr.getPortPointer()))
|
||||||
&& packetVersionMatch(receivedData)) {
|
&& packetVersionMatch(receivedData)) {
|
||||||
if (receivedData[0] == PACKET_TYPE_VOXEL_JURISDICTION) {
|
if (receivedData[0] == PACKET_TYPE_VOXEL_JURISDICTION) {
|
||||||
voxelScripter.getJurisdictionListener()->queueReceivedPacket(senderSockAddr,
|
voxelScripter.getJurisdictionListener()->queueReceivedPacket(senderSockAddr,
|
||||||
|
|
|
@ -312,8 +312,10 @@ void AudioMixer::run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// pull any new audio data from nodes off of the network stack
|
// pull any new audio data from nodes off of the network stack
|
||||||
while ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
while (nodeList->getNodeSocket().hasPendingDatagrams() &&
|
||||||
nodeSockAddr.getAddressPointer(), nodeSockAddr.getPortPointer())) &&
|
(receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
||||||
|
nodeSockAddr.getAddressPointer(),
|
||||||
|
nodeSockAddr.getPortPointer())) &&
|
||||||
packetVersionMatch(packetData)) {
|
packetVersionMatch(packetData)) {
|
||||||
if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO
|
if (packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_NO_ECHO
|
||||||
|| packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO
|
|| packetData[0] == PACKET_TYPE_MICROPHONE_AUDIO_WITH_ECHO
|
||||||
|
|
|
@ -129,7 +129,8 @@ void AvatarMixer::run() {
|
||||||
|
|
||||||
nodeList->possiblyPingInactiveNodes();
|
nodeList->possiblyPingInactiveNodes();
|
||||||
|
|
||||||
if ((receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
if (nodeList->getNodeSocket().hasPendingDatagrams() &&
|
||||||
|
(receivedBytes = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
||||||
nodeSockAddr.getAddressPointer(),
|
nodeSockAddr.getAddressPointer(),
|
||||||
nodeSockAddr.getPortPointer())) &&
|
nodeSockAddr.getPortPointer())) &&
|
||||||
packetVersionMatch(packetData)) {
|
packetVersionMatch(packetData)) {
|
||||||
|
|
|
@ -127,7 +127,7 @@ int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
// set the custom hostname or default if it wasn't passed
|
// set the custom hostname or default if it wasn't passed
|
||||||
if (!customAssignmentServerHostname) {
|
if (!customAssignmentServerHostname) {
|
||||||
customAssignmentServerHostname = LOCAL_ASSIGNMENT_SERVER_HOSTNAME;
|
customAssignmentServerHostname = DEFAULT_ASSIGNMENT_SERVER_HOSTNAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
::customAssignmentSocket = HifiSockAddr(customAssignmentServerHostname, assignmentServerPort);
|
::customAssignmentSocket = HifiSockAddr(customAssignmentServerHostname, assignmentServerPort);
|
||||||
|
|
|
@ -589,8 +589,6 @@ int DomainServer::run() {
|
||||||
quint16 senderPort;
|
quint16 senderPort;
|
||||||
HifiSockAddr nodePublicAddress, nodeLocalAddress;
|
HifiSockAddr nodePublicAddress, nodeLocalAddress;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
nodeList->startSilentNodeRemovalThread();
|
nodeList->startSilentNodeRemovalThread();
|
||||||
|
|
||||||
if (!_staticAssignmentFile.exists() || _voxelServerConfig) {
|
if (!_staticAssignmentFile.exists() || _voxelServerConfig) {
|
||||||
|
@ -613,7 +611,8 @@ int DomainServer::run() {
|
||||||
gettimeofday(&startTime, NULL);
|
gettimeofday(&startTime, NULL);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
while (nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, &senderAddress, &senderPort) &&
|
while (nodeList->getNodeSocket().hasPendingDatagrams()
|
||||||
|
&& nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE, &senderAddress, &senderPort) &&
|
||||||
packetVersionMatch(packetData)) {
|
packetVersionMatch(packetData)) {
|
||||||
if (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) {
|
if (packetData[0] == PACKET_TYPE_DOMAIN_REPORT_FOR_DUTY || packetData[0] == PACKET_TYPE_DOMAIN_LIST_REQUEST) {
|
||||||
// this is an RFD or domain list request packet, and there is a version match
|
// this is an RFD or domain list request packet, and there is a version match
|
||||||
|
|
|
@ -4305,10 +4305,11 @@ void* Application::networkReceive(void* args) {
|
||||||
|
|
||||||
Application* app = Application::getInstance();
|
Application* app = Application::getInstance();
|
||||||
while (!app->_stopNetworkReceiveThread) {
|
while (!app->_stopNetworkReceiveThread) {
|
||||||
if ((bytesReceived = NodeList::getInstance()->getNodeSocket().readDatagram((char*) app->_incomingPacket,
|
if (NodeList::getInstance()->getNodeSocket().hasPendingDatagrams() &&
|
||||||
MAX_PACKET_SIZE,
|
(bytesReceived = NodeList::getInstance()->getNodeSocket().readDatagram((char*) app->_incomingPacket,
|
||||||
senderSockAddr.getAddressPointer(),
|
MAX_PACKET_SIZE,
|
||||||
senderSockAddr.getPortPointer()))) {
|
senderSockAddr.getAddressPointer(),
|
||||||
|
senderSockAddr.getPortPointer()))) {
|
||||||
|
|
||||||
app->_packetCount++;
|
app->_packetCount++;
|
||||||
app->_bytesCount += bytesReceived;
|
app->_bytesCount += bytesReceived;
|
||||||
|
|
|
@ -33,10 +33,12 @@ HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) {
|
||||||
HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort) {
|
HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort) {
|
||||||
// lookup the IP by the hostname
|
// lookup the IP by the hostname
|
||||||
QHostInfo hostInfo = QHostInfo::fromName(hostname);
|
QHostInfo hostInfo = QHostInfo::fromName(hostname);
|
||||||
if (!hostInfo.addresses().isEmpty()) {
|
foreach(const QHostAddress& address, hostInfo.addresses()) {
|
||||||
// use the first IP address
|
if (address.protocol() == QAbstractSocket::IPv4Protocol) {
|
||||||
_address = hostInfo.addresses().first();
|
_address = address;
|
||||||
_port = hostOrderPort; }
|
_port = hostOrderPort;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) {
|
HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) {
|
||||||
|
|
|
@ -611,8 +611,6 @@ int NodeList::processDomainServerList(unsigned char* packetData, size_t dataByte
|
||||||
return readNodes;
|
return readNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
const HifiSockAddr DEFAULT_LOCAL_ASSIGNMENT_SOCKET = HifiSockAddr(QHostAddress(LOCAL_ASSIGNMENT_SERVER_HOSTNAME),
|
|
||||||
DEFAULT_DOMAIN_SERVER_PORT);
|
|
||||||
void NodeList::sendAssignment(Assignment& assignment) {
|
void NodeList::sendAssignment(Assignment& assignment) {
|
||||||
unsigned char assignmentPacket[MAX_PACKET_SIZE];
|
unsigned char assignmentPacket[MAX_PACKET_SIZE];
|
||||||
|
|
||||||
|
@ -623,8 +621,10 @@ void NodeList::sendAssignment(Assignment& assignment) {
|
||||||
int numHeaderBytes = populateTypeAndVersion(assignmentPacket, assignmentPacketType);
|
int numHeaderBytes = populateTypeAndVersion(assignmentPacket, assignmentPacketType);
|
||||||
int numAssignmentBytes = assignment.packToBuffer(assignmentPacket + numHeaderBytes);
|
int numAssignmentBytes = assignment.packToBuffer(assignmentPacket + numHeaderBytes);
|
||||||
|
|
||||||
|
static HifiSockAddr DEFAULT_ASSIGNMENT_SOCKET(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME, DEFAULT_DOMAIN_SERVER_PORT);
|
||||||
|
|
||||||
const HifiSockAddr* assignmentServerSocket = _assignmentServerSocket.isNull()
|
const HifiSockAddr* assignmentServerSocket = _assignmentServerSocket.isNull()
|
||||||
? &DEFAULT_LOCAL_ASSIGNMENT_SOCKET
|
? &DEFAULT_ASSIGNMENT_SOCKET
|
||||||
: &_assignmentServerSocket;
|
: &_assignmentServerSocket;
|
||||||
|
|
||||||
_nodeSocket.writeDatagram((char*) assignmentPacket, numHeaderBytes + numAssignmentBytes,
|
_nodeSocket.writeDatagram((char*) assignmentPacket, numHeaderBytes + numAssignmentBytes,
|
||||||
|
|
|
@ -40,7 +40,7 @@ const int MAX_HOSTNAME_BYTES = 256;
|
||||||
extern const QString DEFAULT_DOMAIN_HOSTNAME;
|
extern const QString DEFAULT_DOMAIN_HOSTNAME;
|
||||||
extern const unsigned short DEFAULT_DOMAIN_SERVER_PORT;
|
extern const unsigned short DEFAULT_DOMAIN_SERVER_PORT;
|
||||||
|
|
||||||
const char LOCAL_ASSIGNMENT_SERVER_HOSTNAME[] = "localhost";
|
const char DEFAULT_ASSIGNMENT_SERVER_HOSTNAME[] = "localhost";
|
||||||
|
|
||||||
const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5;
|
const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5;
|
||||||
|
|
||||||
|
|
|
@ -668,10 +668,11 @@ void VoxelServer::run() {
|
||||||
// ping our inactive nodes to punch holes with them
|
// ping our inactive nodes to punch holes with them
|
||||||
nodeList->possiblyPingInactiveNodes();
|
nodeList->possiblyPingInactiveNodes();
|
||||||
|
|
||||||
if ((packetLength = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
if (nodeList->getNodeSocket().hasPendingDatagrams()
|
||||||
senderSockAddr.getAddressPointer(),
|
&& (packetLength = nodeList->getNodeSocket().readDatagram((char*) packetData, MAX_PACKET_SIZE,
|
||||||
senderSockAddr.getPortPointer())) &&
|
senderSockAddr.getAddressPointer(),
|
||||||
packetVersionMatch(packetData)) {
|
senderSockAddr.getPortPointer()))
|
||||||
|
&& packetVersionMatch(packetData)) {
|
||||||
|
|
||||||
int numBytesPacketHeader = numBytesForPacketHeader(packetData);
|
int numBytesPacketHeader = numBytesForPacketHeader(packetData);
|
||||||
|
|
||||||
|
|
|
@ -62,8 +62,9 @@ int main(int argc, const char* argv[]) {
|
||||||
char senderData[MAX_PACKET_SIZE_BYTES] = {};
|
char senderData[MAX_PACKET_SIZE_BYTES] = {};
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (::serverSocket.readDatagram(senderData, MAX_PACKET_SIZE_BYTES,
|
if (::serverSocket.hasPendingDatagrams()
|
||||||
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer())) {
|
&& ::serverSocket.readDatagram(senderData, MAX_PACKET_SIZE_BYTES,
|
||||||
|
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer())) {
|
||||||
if (senderData[0] == 'A') {
|
if (senderData[0] == 'A') {
|
||||||
// this is a device reporting itself as available
|
// this is a device reporting itself as available
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue