void DuktoProtocol::handleMessage(QByteArray &data, QHostAddress &sender) { char msgtype = data.at(0); switch(msgtype) { case MSG_HELLO_BROADCAST: case MSG_HELLO_UNICAST: data.remove(0, 1); if (data != getSystemSignature()) { mPeers[sender.toString()] = Peer(sender, QString::fromUtf8(data), DEFAULT_UDP_PORT); if (msgtype == MSG_HELLO_BROADCAST) sayHello(sender, DEFAULT_UDP_PORT); emit peerListAdded(mPeers[sender.toString()]); } break; case MSG_GOODBYE: emit peerListRemoved(mPeers[sender.toString()]); mPeers.remove(sender.toString()); break; case MSG_HELLO_PORT_BROADCAST: case MSG_HELLO_PORT_UNICAST: data.remove(0, 1); qint16 port = *((qint16*) data.constData()); data.remove(0, 2); if (data != getSystemSignature()) { mPeers[sender.toString()] = Peer(sender, QString::fromUtf8(data), port); if (msgtype == MSG_HELLO_PORT_BROADCAST) sayHello(sender, port); emit peerListAdded(mPeers[sender.toString()]); } break; } }
void DuktoProtocol::handleMessage(QByteArray &data, QHostAddress &sender) { char msgtype = data.at(0); switch(msgtype) { case 0x01: // HELLO (broadcast) case 0x02: // HELLO (unicast) data.remove(0, 1); if (data != getSystemSignature()) { mPeers[sender.toString()] = Peer(sender, QString::fromUtf8(data), DEFAULT_UDP_PORT); if (msgtype == 0x01) sayHello(sender, DEFAULT_UDP_PORT); emit peerListAdded(mPeers[sender.toString()]); } break; case 0x03: // GOODBYE emit peerListRemoved(mPeers[sender.toString()]); mPeers.remove(sender.toString()); break; case 0x04: // HELLO (broadcast) with PORT case 0x05: // HELLO (unicast) with PORT data.remove(0, 1); qint16 port = *((qint16*) data.constData()); data.remove(0, 2); if (data != getSystemSignature()) { mPeers[sender.toString()] = Peer(sender, QString::fromUtf8(data), port); if (msgtype == 0x04) sayHello(sender, port); emit peerListAdded(mPeers[sender.toString()]); } break; } }
void DuktoProtocol::sayHello(QHostAddress dest, qint16 port) { // Preparazione pacchetto QByteArray packet; if ((port == DEFAULT_UDP_PORT) && (mLocalUdpPort == DEFAULT_UDP_PORT)) { if (dest == QHostAddress::Broadcast) packet.append(MSG_HELLO_BROADCAST); else packet.append(MSG_HELLO_UNICAST); } else { if (dest == QHostAddress::Broadcast) packet.append(MSG_HELLO_PORT_BROADCAST); else packet.append(MSG_HELLO_PORT_BROADCAST); packet.append((char*)&mLocalUdpPort, sizeof(qint16)); } packet.append(getSystemSignature()); // Invio pacchetto if (dest == QHostAddress::Broadcast) { QList<qint16> ports; ports.append(DEFAULT_UDP_PORT); if (port != DEFAULT_UDP_PORT) ports.append(port); sendToAllBroadcast(packet, ports); } else mSocket->writeDatagram(packet.data(), packet.length(), dest, port); }
void DuktoProtocol::sayHello(QHostAddress dest, qint16 port) { // Preparazione pacchetto QByteArray *packet = new QByteArray(); if ((port == DEFAULT_UDP_PORT) && (mLocalUdpPort == DEFAULT_UDP_PORT)) { if (dest == QHostAddress::Broadcast) packet->append(0x01); // 0x01 -> HELLO MESSAGE (broadcast) else packet->append(0x02); // 0x02 -> HELLO MESSAGE (unicast) } else { if (dest == QHostAddress::Broadcast) packet->append(0x04); // 0x04 -> HELLO MESSAGE (broadcast) with PORT else packet->append(0x05); // 0x05 -> HELLO MESSAGE (unicast) with PORT packet->append((char*)&mLocalUdpPort, sizeof(qint16)); } packet->append(getSystemSignature()); // Invio pacchetto if (dest == QHostAddress::Broadcast) { sendToAllBroadcast(packet, port); if (port != DEFAULT_UDP_PORT) sendToAllBroadcast(packet, DEFAULT_UDP_PORT); } else mSocket->writeDatagram(packet->data(), packet->length(), dest, port); delete packet; }