Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/lib/network/network_stream.h @ 10083

Last change on this file since 10083 was 9869, checked in by bensch, 18 years ago

orxonox/trunk: merged the new_class_id branche back to the trunk.
merged with command:
svn merge https://svn.orxonox.net/orxonox/branches/new_class_id trunk -r9683:HEAD
no conflicts… puh..

File size: 5.5 KB
Line 
1/*!
2 * @file network_stream.h
3 *  implementation of a network pipe
4 */
5
6#ifndef _NETWORK_STREAM
7#define _NETWORK_STREAM
8
9#include <vector>
10#include <list>
11#include <map>
12
13#include "data_stream.h"
14#include "server_socket.h"
15#include "handshake.h"
16#include "monitor/connection_monitor.h"
17#include "udp_server_socket.h"
18#include "peer_info.h"
19
20#include "shared_network_data.h"
21
22class Synchronizeable;
23class NetworkSocket;
24class ServerSocket;
25class NetworkGameManager;
26class NetworkMonitor;
27
28
29typedef std::list<Synchronizeable*>  SynchronizeableList;
30typedef std::map<int,PeerInfo>       PeerList;
31
32
33class NetworkStream : public DataStream
34{
35  ObjectListDeclaration(NetworkStream);
36  public:
37    NetworkStream();
38    NetworkStream(int nodeType);
39    virtual ~NetworkStream();
40
41    void init();
42
43    /* network interface controls */
44    void connectToMasterServer(std::string host, int port);
45    void connectToProxyServer(int proxyId, std::string host, int port);
46    void createServer(int clientPort, int proxyPort, int clientSoftPort);
47
48    void createNetworkGameManager();
49    void startHandshake(int userId = NET_ID_MASTER_SERVER);
50
51    void reconnectToServer(IP address);
52    void softReconnectToServer(int serverUserId, IP address);
53    void prepareSoftConnection(int userId);
54
55
56    /* synchronizeable interface */
57    void connectSynchronizeable(Synchronizeable& sync);
58    void disconnectSynchronizeable(Synchronizeable& sync);
59
60    inline int getMaxConnections(){ return SharedNetworkData::getInstance()->getMaxPlayer(); }
61
62    /* functions for the peerInfo information retreival */
63    /** @returns true if this userId is activated at this client false if not*/
64    inline bool isUserIdActive( int userID ) { return (peers.find(userID) != peers.end()); }
65    /** @returns true if this userId is a local client */
66    inline bool isUserLocal( int userID) { return this->isUserIdActive(userID); }
67    /** @returns true if this user is a master server */
68    inline bool isUserMasterServer( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isMasterServer(); }
69    /** @returns true if this user is a proxy server */
70    inline bool isUserProxyServerActive( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isProxyServerActive(); }
71    /** @returns true if this user is a client */
72    inline bool isUserClient( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isClient(); }
73
74    /* peering interface */
75    inline PeerInfo & getPeerInfo( int userId ) { return peers[userId]; }
76    inline PeerInfo* getPeerInfo() { return this->pInfo; }
77    inline PeerList getPeerInfoList() { return this->peers; }
78
79    inline void setRedirectionTest() { this->bSoftRedirect = true; }
80
81    /* data processing*/
82    virtual void processData();
83
84    /* debugging */
85    void debug();
86
87
88  private:
89
90    inline SynchronizeableList::const_iterator getSyncBegin(){ return synchronizeables.begin(); }
91    inline SynchronizeableList::const_iterator getSyncEnd(){ return synchronizeables.end(); }
92    void cleanUpOldSyncList();
93    int getSyncCount();
94
95    void updateConnectionList();
96
97    /* handle processes */
98    void handleHandshakes();
99    void handleUpstream( int tick );
100    void handleDownstream(int tick );
101
102    /* handle events*/
103    void handleNewClient( int userId );
104
105    void handleConnect( int userId);
106    void handleSoftConnect( int userId);
107    void handleReconnect( int userId );
108    void handleDisconnect( int userId );
109    void handleSoftDisconnect( int userId);
110
111    void writeToNewDict( byte * data, int length, bool upstream );
112
113
114  private:
115    PeerList                   peers;                       //!< list of the network node informations
116
117    PeerInfo*                  pInfo;                       //!< the info about the local peer node (not in the PeerList)
118
119    std::list<int>             freeSocketSlots;             //!< list of free sockets (to ensure not to resycle sockets)
120    int                        currentState;                //!< current state id
121
122    NetworkMonitor*            networkMonitor;              //!< the network monitor
123    NetworkGameManager*        networkGameManager;          //!< reference to the network game manager
124    ServerSocket*              clientSocket;                //!< the listening socket for clients of the server
125    ServerSocket*              clientSoftSocket;            //!< the listening socket for soft connections to the server
126    ServerSocket*              proxySocket;                 //!< socket for proxy connections
127
128    std::map<int,int>          oldSynchronizeables;         //!< used to save recently deleted sync ids to not recreate them
129    SynchronizeableList        synchronizeables;            //!< list of the synchronizeables
130
131    byte                       buf[UDP_PACKET_SIZE];        //!< used by handleUp/Downstream
132    byte                       compBuf[UDP_PACKET_SIZE];    //!< used by handleUp/Downstream
133    int                        remainingBytesToWriteToDict; //!< if > 0 NetworkStream will write packets to DATA/dicts/newdict
134
135    int                        dictServer;                  //!< the zip dict for the server
136    int                        dictClient;                  //!< the zip dict for the client
137
138    bool                       bRedirect;                   //!< true if the master server sent a redirect command
139    int                        redirectionUID;              //!< uid of the redir host
140    bool                       bSoftRedirect;               //!< tsting
141};
142#endif /* _NETWORK_STREAM */
Note: See TracBrowser for help on using the repository browser.