void ServerSearch::on_refreshButton_clicked()
{
    ui->listWidget->clear();

    QByteArray datagram(Helper::serverSearchRequest().toUtf8(), Helper::serverSearchRequest().length());
    m_pUdpSocket->writeDatagram(datagram, QHostAddress::Broadcast, Helper::serverSearchPort());
}
Example #2
0
void Message::tsend(QString aMessage)
{
  //  qDebug() <<aMessage;
   QByteArray datagram(aMessage.toAscii());

  //  QByteArray datagram = "Message";
    udpSocket->writeDatagram(datagram.data(), datagram.size(),QHostAddress("134.117.27.122"),45555);
}
Example #3
0
void UDPServer::sendAnswer( pAnswer & _pa, QHostAddress src_host, uint id )
{
	char data[65536];
	int len;
	_pa.getDatagram(data, &len);

	QByteArray datagram(data, len);
	m_pobjUDPOutSocket->writeDatagram(datagram.data(), datagram.size(), src_host, m_mapClientsInfo[id].m_mapAddrs[ src_host.toString() ] );
}
Example #4
0
void SocksServer::sd_activated()
{
    while (d->sd->hasPendingDatagrams()) {
        QByteArray datagram(d->sd->pendingDatagramSize(), Qt::Uninitialized);
        QHostAddress sender;
        quint16 senderPort;
        auto sz = d->sd->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
        if (sz >= 0) {
            datagram.truncate(sz);
            incomingUDP(sender.toString(), senderPort, d->sd->peerAddress(), d->sd->peerPort(), datagram);
        }
    }
}
Example #5
0
  void SocksConnection::HandleUdpResponse(const TunnelPacket &packet)
  {
    qDebug() << "SOCKS got UDP response";

    QByteArray address;
    if(!SerializeSocksAddress(packet.GetHost(), packet.GetPort(), address)) {
      qDebug() << "SOCKS unable to serialize address";
    }
    
    // First 3 bytes should be 0, followed by address, then data
    QByteArray datagram(3, 0);
    datagram += address + packet.GetMessage();
    _udp_socket->writeDatagram(datagram, _udp_peer, _udp_peer_port);
  }
bool ARControlConnection::sendFrame(quint8 type, quint8 id, quint8 seq, const char *data, quint32 dataSize)
{
    Q_D(ARControlConnection);

    // Check we're actually able to send.
    if(d->c2d == NULL || !d->c2d->isWritable())
    {
        d->errorString = "Control connection not establised.";
        emit error();
        return false;
    }

    QByteArray  datagram(ARNETWORK_FRAME_HEADER_SIZE + dataSize, 0x00);
    QDataStream stream(&datagram, QIODevice::WriteOnly);
    stream.setByteOrder(QDataStream::LittleEndian);

    // Write frame header to buffer.
    stream << type
           << id
           << seq
           << (quint32)datagram.size();

    // Write frame payload to buffer.
    if(dataSize > 0) stream.writeRawData(data, dataSize);

    qint64 result = d->c2d->write(datagram.constData(), datagram.size());
    if(result != datagram.size())
    {
        //TODO: Maybe retry here ..
        WARNING_T("Failed to send complete message");
        return false;
    }

    if(type != ARControlConnection::LowLatencyData)
    {
        DEBUG_T(QString(">> %1:%2 [%3]")
                .arg(d->c2d->peerAddress().toString())
                .arg(d->c2d->peerPort())
                .arg(QString(datagram.toHex())));
    }

    return true;
}
Example #7
0
void TIDorb::core::comm::UDPConnection::read(unsigned char* buffer, size_t buffer_size,
                                             size_t offset, size_t length)
{
  try {
    while (length > 0) {

      // Copy datagram bytes available in read buffer
      size_t available = datagram_size - datagram_offset;
      if (available) {
        size_t to_copy = MIN(length, available);
        memcpy(buffer + offset, datagram_buffer + datagram_offset, to_copy);

        offset += to_copy;
        length -= to_copy;

        datagram_offset += to_copy;

      } else {

        // Read another datagram
        TIDSocket::DatagramPacket datagram(datagram_buffer, datagram_max_size,
                                           0, datagram_max_size);
        socket->receive(datagram);

        datagram_size   = datagram.getLength();
        if (datagram_size < 0) {
          throw CORBA::COMM_FAILURE("read error", 0, CORBA::COMPLETED_NO);
        }
      
        datagram_offset = 0;

      }
    }

  } catch(const TIDSocket::Exception& e) {
    CORBA::COMM_FAILURE connection_error(e.what(), 0, CORBA::COMPLETED_NO);
    // TODO: ?seguro que este close()?
    close_by_broken_connection(connection_error);
    throw connection_error;
  }

}
Example #8
0
void Discover::expireRecords ()
{
	int next = 1000; // Maximum default interval for expiration
	quint64 now = QDateTime::currentMSecsSinceEpoch();
	for (const auto& pair : foundRecords.toStdMap())
	{
		int delta = pair.second - now;
		if (delta <= 0)
		{
			// It's expired
			logDebug(QString("Lost Record: %1").arg(pair.first.toString()));
			foundRecords.remove(pair.first);

			// Notify this app
			emit recordLost(pair.first);

			// Server: Forward global departures to other global peers
			if (mServerMode)
			{
				QList<Record> recordInListForm;
				recordInListForm.append(pair.first);

				QByteArray datagram("DSDD");
				datagram += makeDatagram(recordInListForm, false);

				for (Record& record : foundRecords.keys())
				if (record["Scope"] == "Global")
				{
					bool ok;
					globalSocket->writeDatagram(datagram, QHostAddress(record["Address"]), record["Port"].toUInt(&ok, 10));
				}
			}

		}
		else if (delta < next) next = delta; // Set the timer for this one
	}
	// Set timer for next time
	expireTimer->start(next);
}
Example #9
0
void TIDorb::core::comm::UDPConnection::write(unsigned char* buffer, 
                                              size_t buffer_size, 
                                              size_t offset, size_t length)
{
  try {
    size_t numWrittenNow = 0;
    
    TIDSocket::InetSocketAddress addr(initial_point._host, initial_point._port,
                                      _orb->conf().prefer_ipv6);
    TIDSocket::DatagramPacket datagram(buffer, buffer_size, offset, length, addr);
    char* interface = NULL;
    if (_orb->conf().prefer_ipv6) {
      string point = initial_point._host;
      string::size_type colon_position = point.find('%');
      if (colon_position != string::npos)
        interface = CORBA::string_dup(point.substr(colon_position + 1).c_str());
    }
    while (length > 0) {
      
      socket->send(datagram);

      numWrittenNow = datagram.getLength();      
      if (numWrittenNow < 0) {
        throw CORBA::COMM_FAILURE("write error", 0, CORBA::COMPLETED_NO);
      }

      offset += numWrittenNow;
      length -= numWrittenNow;

      datagram.setData(buffer, buffer_size, offset, length); 
    }

  } catch(const TIDSocket::Exception& e) {
    CORBA::COMM_FAILURE connection_error(e.what(), 0, CORBA::COMPLETED_NO);
    close_by_broken_connection(connection_error);
    throw connection_error;
  }
}
void ARControlConnection::onReadyRead()
{
    Q_D(ARControlConnection);

    while(d->d2c->hasPendingDatagrams())
    {
        QHostAddress remoteAddr;
        quint16      remotePort;

        // If we've not received enough data, then return and wait for more.
        if(d->d2c->pendingDatagramSize() < ARNETWORK_FRAME_HEADER_SIZE) break;

        QByteArray datagram(d->d2c->pendingDatagramSize(), 0x00);
        quint32 offset = 0;

        d->d2c->readDatagram(datagram.data(), datagram.size(), &remoteAddr, &remotePort);

        while(offset < datagram.size())
        {
            ARControlFrame frame;
            frame.type = static_cast<quint8>(datagram[offset + 0]);
            frame.id = static_cast<quint8>(datagram[offset + 1]);
            frame.seq = static_cast<quint8>(datagram[offset + 2]);
            frame.size = qFromLittleEndian(*((quint32*)(datagram.constData() + offset + 3)));

            // Copy datagram data to frame if the frame size is larger than just the header.
            if(frame.size > ARNETWORK_FRAME_HEADER_SIZE)
            {
                const char *data = datagram.constData();
                frame.payload.insert(0, data + offset + ARNETWORK_FRAME_HEADER_SIZE, frame.size - ARNETWORK_FRAME_HEADER_SIZE);
            }

            // Output comms debug info (if it's not a video data frame).
            if(frame.id != ARNET_D2C_VIDEO_DATA_ID)
            {
                DEBUG_T(QString("<< %1:%2 [%3]")
                        .arg(remoteAddr.toString())
                        .arg(remotePort)
                        .arg(QString(datagram.toHex())));
            }

            // Process frame depending on buffer id.
            if(frame.id == ARNET_D2C_PING_ID)
            {
                onPing(frame);
            }
            else if(frame.id == ARNET_D2C_EVENT_ID || frame.id == ARNET_D2C_NAVDATA_ID)
            {
                onNavdata(frame);
            }
            else if(frame.id == ARNET_D2C_VIDEO_DATA_ID)
            {
                onVideoData(frame);
            }
            else
            {
                WARNING_T(QString("Unhandled frame id: %1").arg(frame.id));
            }

            // Increment datagram offset to continue processing next frame.
            offset += frame.size;
        }
    }
}
Example #11
0
void Discover::acceptRecords (QList<Record> records, bool removeThem, QString senderScope, QString senderAddress, QString senderPort)
{
	// TODO
	
	// This function gets its own copy of records
	// This loop edits each item so it can be used after
	for (Record& record : records)
	{
		// Preprocess the record before considering it
		Record::decompressReserved(record);

		// Set the scope based on the address if included, otherwise scope of sender
		QHostAddress recordAddress;
		if (record.has("Address")) recordAddress.setAddress(record["Address"]);
		if (recordAddress.protocol()!=QAbstractSocket::IPv4Protocol) recordAddress = QHostAddress::Null;
		if (recordAddress==QHostAddress::Broadcast) recordAddress = QHostAddress::Null;
		if (recordAddress==QHostAddress::AnyIPv4) recordAddress = QHostAddress::Null;
		if (recordAddress.isNull())
		{
			record["Scope"] = senderScope;
		}
		else
		{
				 if (recordAddress.isLoopback())    record["Scope"] = "Loopback";
			else if (addressIsLocal(recordAddress)) record["Scope"] = "Local";
			else                                    record["Scope"] = "Global";
		}

		if (record["Address"].isEmpty()) record["Address"] = senderAddress; // Sender may override these
		if (record["Port"].isEmpty()) record["Port"] = senderPort; // Sender may override these
		// TODO Extract a custom expiration duration so each record can have its own


		if (removeThem)
		{
			// See if it's new
			if (foundRecords.contains(record))
			{
				logDebug(QString("Record Departed: %1").arg(record.toString()));
				foundRecords.remove(record);
				emit recordLost(record);
			}
		}
		else
		{
			// See if it's new
			if (not foundRecords.contains(record) and passesFilters(record))
			{
				logDebug(QString("Found Record: %1").arg(record.toString()));
				emit recordFound(record);
			}

			// Reset the timer
			foundRecords[record] = QDateTime::currentMSecsSinceEpoch() + 2500; // Set the expire time
		}

		expireTimer->start(0); // In case the next expiration time was changed
	}
	
	// Server: Forward global departures to other global peers
	if (mServerMode and removeThem and senderScope == "Global")
	{
		QByteArray datagram("DSDD");
		datagram += makeDatagram(records, false);
		
		for (Record& record : foundRecords.keys())
		if (record["Scope"] == "Global")
		{
			bool ok;
			globalSocket->writeDatagram(datagram, QHostAddress(record["Address"]), record["Port"].toUInt(&ok, 10));
		}
	}
}
Example #12
0
void Discover::announceRecords ()
{
	// Reset timer
	timer->start(announcePeriodMsec);

	if (not running) return;

	// Servers don't announce periodically or send departure messages
	if (mServerMode) return;

	// Start building a list of records to send in each scope
	QList<Record> recordsToSend;

	///////////////////////////////////////////////////////////////////////
	// Global scope first
	///////////////////////////////////////////////////////////////////////
	for (Record record : ownedRecords)
	if (record["Scope"] == "Global")
	{
		recordsToSend.push_back(record);
	}
	if (not recordsToSend.empty() or defaultScope=="Global")
	{
		// This is a discovery request which should be responded to
		QByteArray datagram("DSDR");
		if (departure) datagram = "DSDD";
		datagram += makeDatagram(recordsToSend, false);

		// Send to each Global server
		for (QPair<QHostAddress,quint16> globalServer : globalServers)
		{
			globalSocket->writeDatagram(datagram, globalServer.first, globalServer.second);
		}
	}

	///////////////////////////////////////////////////////////////////////
	// Local scope next
	///////////////////////////////////////////////////////////////////////
	for (Record record : ownedRecords)
	if (record["Scope"] == "Local")
	{
		recordsToSend.push_back(record);
	}
	if (not recordsToSend.empty() or defaultScope=="Global" or defaultScope=="Local")
	{
		QByteArray datagram("DSDA");
		if (announceNeedsResponse) datagram = "DSDR";
		if (departure)             datagram = "DSDD";
		datagram += makeDatagram(recordsToSend, true);

		// For each interface
		for (auto iface : QNetworkInterface::allInterfaces())
		{
			// For each IPv4 address on this interface
			for (auto entry : iface.addressEntries())
			{
				if (entry.ip().protocol() != QAbstractSocket::IPv4Protocol) continue;

				// Add it to addressEntryCache if necessary for local scope testing
				if (not addressEntryCache.contains(entry)) addressEntryCache.push_back(entry);

				// Multicast
				if (iface.flags().testFlag(QNetworkInterface::CanMulticast) and !entry.ip().isNull() and !entry.ip().isLoopback())
				{
					// Create the socket if it doesn't exit yet
					if (not multiSocket.contains(entry.ip().toString()))
					{
						logDebug(QString("New multicast socket: %1 %2").arg(entry.ip().toString(), entry.netmask().toString()));

						// Add it, create and bind the socket
						QUdpSocket* socket = new QUdpSocket(this);
						connect(socket, SIGNAL(readyRead()), this, SLOT(readDatagrams()));
						socket->setSocketOption(QAbstractSocket::MulticastTtlOption, 1);
						if (not socket->bind(QHostAddress::AnyIPv4, port, QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint))
						{
							logWarning(QString("Error binding to iface %1: %2").arg(entry.ip().toString(), socket->errorString()));
						}
						socket->setMulticastInterface(iface);
						socket->joinMulticastGroup(groupAddress, iface);
						multiSocket.insert(entry.ip().toString(), socket);
					}

					// Send datagram
					multiSocket[entry.ip().toString()]->writeDatagram(datagram, groupAddress, port);
				}
			}
		}
	}

	///////////////////////////////////////////////////////////////////////
	// Loopback scope last
	///////////////////////////////////////////////////////////////////////
	for (Record record : ownedRecords)
	if (record["Scope"] == "Loopback")
	{
		recordsToSend.push_back(record);
	}
	if (not recordsToSend.empty() or true) // Any scope is above or equivalent to loopback
	{
		QByteArray datagram("DSDA");
		if (announceNeedsResponse) datagram = "DSDR";
		if (departure)             datagram = "DSDD";
		datagram += makeDatagram(recordsToSend, true);

		// Loopback
		//loopbackSocket->writeDatagram(datagram, QHostAddress::LocalHost, port);
	}

	// Reset
	announceNeedsResponse = false;
	departure = false;
}
Example #13
0
void Dialog::sendToSpeaker(char*data,int totalLen)//send via UDP
{

    QByteArray datagram(data,totalLen);
    udpSocketOut->writeDatagram(datagram.data(), datagram.size(), QHostAddress::LocalHost, 1500);
}
Example #14
0
void MainWindow::processDatagrams()
{

    const hdr_t  *request;

    do {
        qint64 sz = _udpSocket.pendingDatagramSize();
        Q_ASSERT(sz >= (qint64) sizeof(hdr_t));
        QByteArray      datagram(sz,0);
        QByteArray      rdatagram;
        QHostAddress    host;
        quint16         port;
        bool            res;

        Q_ASSERT(sz == _udpSocket.readDatagram(datagram.data(), datagram.size(), &host, &port));

        request = (hdr_t*) datagram.constData();
        Q_ASSERT(datagram.size() == request->pdusz);

        // _log << "Req:" << *request << endl;

        // skip respons messages
        if(request->cmdid >= RDSK_Response)
        {
           // _log << ", skip" << endl;
            continue;
        }

        QHostInfo hi = QHostInfo::fromName(host.toString());
        QString   hn(hi.hostName());
        QVariant var;
        CPMClient* client;
        QList<QTreeWidgetItem*> clientitem = ui->treeWidget->findItems(hn,Qt::MatchFixedString);


        if(clientitem.isEmpty())
        {
            client = new CPMClient(hn);
            connect(client,SIGNAL(adddrive(CPMClient*,CPMDrive*)),this,SLOT(adddrive(CPMClient*,CPMDrive*)));
            var.setValue(client);
            QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(hn));
            item->setData(0,Qt::UserRole, var);
            ui->treeWidget->addTopLevelItem(item);
        }
        else
        {
            var = clientitem.first()->data(0,Qt::UserRole);
        }

        client = qobject_cast<CPMClient*>(qvariant_cast<QObject*>(var));
        Q_ASSERT(client);

        res = client->req(*request, rdatagram);
        hdr_t  *response = (hdr_t*)rdatagram.data();


        if(!res)
            _log << "ERR:" << *response << endl;

        sz = _udpSocket.writeDatagram((const char*)response, (qint64)response->pdusz, host, port);
        if(_clientwidget)
            _clientwidget->update();
        Q_ASSERT( sz == response->pdusz);

    }while(_udpSocket.hasPendingDatagrams());