Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/cpp11_v2/src/libraries/network/Connection.h @ 11016

Last change on this file since 11016 was 11006, checked in by landauf, 9 years ago

made some enums in network library strongly typed. for most other enums in network this isn't possible because they are often used like flags (converted to int and compared with binary operators).
packet::Type now uses uint8_t as underlying type which reduces the network traffic (by default the type was int)

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29//
30// C++ Interface: Connection
31//
32// Description:
33//
34//
35// Author:  Oliver Scheuss, (C) 2007
36//
37// Copyright: See COPYING file that comes with this distribution
38//
39//
40#ifndef _Connection_H__
41#define _Connection_H__
42
43#include "NetworkPrereqs.h"
44
45#include <deque>
46#include <map>
47#include <enet/enet.h>
48
49namespace boost
50{
51  class thread;
52  class mutex;
53}
54
55namespace orxonox
56{
57  const unsigned int NETWORK_PORT                   = 55556;
58  const unsigned int NETWORK_MAX_CONNECTIONS        = 50;
59  const unsigned int NETWORK_WAIT_TIMEOUT           = 1;
60  const unsigned int NETWORK_MAX_QUEUE_PROCESS_TIME = 5;
61 
62  enum class IncomingEventType
63  {
64    receivePacket   = 1,  // incoming packet
65    peerConnect     = 2,  // incoming connect request
66    peerDisconnect  = 3   // incoming disconnect request
67  };
68 
69  enum class OutgoingEventType
70  {
71    sendPacket      = 1,  // outgoing packet
72    broadcastPacket = 2,  // outgoing broadcast packet
73    disconnectPeer  = 3,  // outgoing disconnect request
74    disconnectPeers = 4   // outgoing disconnect request
75  };
76 
77  struct _NetworkExport incomingEvent
78  {
79    uint32_t          peerID;
80    IncomingEventType type;
81    packet::Packet*   packet;
82  };
83 
84  struct _NetworkExport outgoingEvent
85  {
86    uint32_t          peerID;
87    OutgoingEventType type;
88    ENetPacket*       packet;
89    ENetChannelID     channelID;
90  };
91 
92  class _NetworkExport Connection
93  {
94  public:
95    virtual ~Connection();
96
97  protected:
98    Connection(uint32_t firstPeerID = NETWORK_PEER_ID_SERVER+1);
99   
100    void startCommunicationThread();
101    void stopCommunicationThread();
102   
103    void addPacket(ENetPacket *packet, uint32_t peerID, uint8_t channelID);
104    void broadcastPacket(ENetPacket* packet, uint8_t channelID);
105    void disconnectPeer(uint32_t peerID);
106    void disconnectPeers();
107   
108    void enableCompression();
109
110    void processQueue();
111    void waitOutgoingQueue();     // wait for the outgoing queue to become empty (everything processed by communication thread)
112    virtual void addPeer(uint32_t peerID)=0;
113    virtual void removePeer(uint32_t peerID)=0;
114    virtual void processPacket( packet::Packet* packet)=0;
115   
116    incomingEvent preprocessConnectEvent(ENetEvent& event);
117    incomingEvent preprocessDisconnectEvent(ENetEvent& event);
118    incomingEvent preprocessReceiveEvent(ENetEvent& event);
119   
120    void processIncomingEvent(ENetEvent& event);
121    void processOutgoingEvent(outgoingEvent& event);
122   
123    void disconnectPeersInternal();
124
125    ENetHost*                     host_;
126  private:
127    void communicationThread();
128   
129    boost::thread*                communicationThread_;
130    bool                          bCommunicationThreadRunning_;
131    ENetAddress*                  bindAddress_;
132    std::deque<incomingEvent>     incomingEvents_;
133    std::deque<outgoingEvent>     outgoingEvents_;
134    boost::mutex*                 incomingEventsMutex_;
135    boost::mutex*                 outgoingEventsMutex_;
136    boost::mutex*                 overallMutex_;
137    std::map<uint32_t, ENetPeer*> peerMap_;
138    std::map<ENetPeer*, uint32_t> peerIDMap_;
139    uint32_t                      nextPeerID_;
140
141  };
142
143}
144
145#endif /* _Connection_H__ */
Note: See TracBrowser for help on using the repository browser.