Commit a0fbe9284b1538f9149b43581adcda3847f6f0a0

add client which can receive the server broadcast message, no handling yet though.
  
11SET(
22 CLASSES
33 NetworkClient
4 NetworkClient_ServerDiscoverer
45)
56
67SET(SOURCES)
  
11#include "NetworkClient.h"
2#include "NetworkClient_ServerDiscoverer.h"
23
34#include <QApplication>
45#include <QDebug>
88NetworkClient::NetworkClient()
99: QObject(0)
1010{
11 new ServerDiscoverer(this);
1112}
1213
1314QString NetworkClient::pluginName() const
  
1414 QString pluginAuthor() const;
1515 QString uniqueId() const;
1616 private:
17 class Implementation;
17 class ServerDiscoverer;
1818};
  
1#include "NetworkClient_ServerDiscoverer.h"
2
3#include "../NetworkCommon/NetworkCommon.h"
4
5#include <QUdpSocket>
6
7NetworkClient::ServerDiscoverer::ServerDiscoverer(QObject* parent)
8: QObject(parent)
9, m_socket(new QUdpSocket(this))
10{
11 m_socket->bind();
12 connect(m_socket, SIGNAL(readyRead()), SLOT(handleResponses()));
13 sendBroadcast();
14}
15
16void NetworkClient::ServerDiscoverer::sendBroadcast()
17{
18 m_socket->writeDatagram(NetworkCommon::discoveryMessage(), QHostAddress::Broadcast, NetworkCommon::portNumber());
19}
20
21void NetworkClient::ServerDiscoverer::handleResponses()
22{
23 while(m_socket->hasPendingDatagrams())
24 {
25 // don't worry about overflow, UDP packets have reasonable maximum size
26 QByteArray payload;
27 payload.resize(m_socket->pendingDatagramSize());
28 QHostAddress source;
29 quint16 sourcePort;
30 m_socket->readDatagram(payload.data(), payload.size(), &source, &sourcePort);
31 if(sourcePort != NetworkCommon::portNumber())
32 {
33 qDebug() << "Got a stray UDP packet from" << QString("%1:%2").arg(source.toString()).arg(sourcePort);
34 continue;
35 }
36 else
37 {
38 qDebug() << "Got a response:" << payload;
39 }
40 }
41}
  
1#pragma once
2
3#include "NetworkClient.h"
4
5class QUdpSocket;
6
7#include <QPair> // before QHostAddress for Qt 4.5
8
9#include <QHostAddress>
10
11class NetworkClient::ServerDiscoverer : public QObject
12{
13 Q_OBJECT;
14 public:
15 ServerDiscoverer(QObject* parent);
16 signals:
17 void foundServer(const QString& name, const QByteArray& uuid, const QHostAddress& address, quint16 tcpPort);
18 private slots:
19 void sendBroadcast();
20 void handleResponses();
21 private:
22 QUdpSocket* m_socket;
23};
  
1SET(
2 CLASSES
3 NetworkCommon
4)
5
6SET(SOURCES)
7SET(HEADERS)
8FOREACH(class ${CLASSES})
9 LIST(APPEND SOURCES ${class}.cpp)
10 LIST(APPEND HEADERS ${class}.h)
11ENDFOREACH()
12
13INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
14QT4_WRAP_CPP(MOC_SOURCES ${HEADERS})
15ADD_LIBRARY(
16 NetworkCommon
17 ${SOURCES}
18 ${MOC_SOURCES}
19)
  
1#include "NetworkCommon.h"
2
3#include <QDebug>
4#include <QtPlugin>
5
6NetworkCommon::NetworkCommon()
7: QObject(0)
8{
9}
10
11QString NetworkCommon::pluginName() const
12{
13 return tr("Common Network Client/Server Plugin");
14}
15
16QString NetworkCommon::pluginAuthor() const
17{
18 return QString::fromLatin1("Fred Emmott");
19}
20
21QString NetworkCommon::uniqueId() const
22{
23 return "org.jerboaplayer.NetworkCommon";
24}
25
26quint16 NetworkCommon::portNumber()
27{
28 return 61719; // pseudo-random from private range
29}
30
31QByteArray NetworkCommon::discoveryMessage()
32{
33 return "Jerboa Network Discovery/1.0\n";
34}
35
36Q_EXPORT_PLUGIN2(Jerboa_NetworkCommon, NetworkCommon);
  
1#pragma once
2
3#include "Plugin.h"
4
5#include <QObject>
6
7class NetworkCommon: public QObject, public Jerboa::Plugin
8{
9 Q_OBJECT;
10 Q_INTERFACES(Jerboa::Plugin);
11 public:
12 NetworkCommon();
13 QString pluginName() const;
14 QString pluginAuthor() const;
15 QString uniqueId() const;
16
17 static quint16 portNumber();
18 static QByteArray discoveryMessage();
19};
  
11#include "NetworkServer_Implementation.h"
22
3#include "../NetworkCommon/NetworkCommon.h"
4
35#include "Uuid.h"
46
57#include <QDebug>
1010#include <QTcpServer>
1111#include <QUdpSocket>
1212
13const quint16 PORT_NUMBER = 61719; // pseudo-random from private range
14const QByteArray DISCOVERY_MESSAGE = "Jerboa Network Discovery/1.0\n";
15
1613NetworkServer::Implementation::Implementation(Jerboa::CollectionInterface* collection, Jerboa::PlayerInterface* player, Jerboa::PlaylistInterface* playlist)
1714: QObject(0)
1815, m_collection(collection)
1818, m_discoverySocket(new QUdpSocket(this))
1919, m_server(new QTcpServer(this))
2020{
21 const bool startedDiscovery = m_discoverySocket->bind(QHostAddress::Any, PORT_NUMBER);
21 const bool startedDiscovery = m_discoverySocket->bind(QHostAddress::Any, NetworkCommon::portNumber());
2222 if(!startedDiscovery)
2323 {
2424 qDebug() << "Failed to start network discovery:" << m_discoverySocket->errorString();
108108 QHostAddress source;
109109 quint16 sourcePort;
110110 m_discoverySocket->readDatagram(payload.data(), payload.size(), &source, &sourcePort);
111 if(payload == DISCOVERY_MESSAGE)
111 if(payload == NetworkCommon::discoveryMessage())
112112 {
113113 qDebug() << "Received a discovery message from" << QString("%1:%2").arg(source.toString()).arg(sourcePort);
114114 // send a response