Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/lib/network/network_stream.h @ 9422

Last change on this file since 9422 was 9422, checked in by patrick, 18 years ago

made the network stream interface more flexible in terms of connection reestablishing and fixed some segfaults connected to connection restarts

File size: 4.1 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
36  public:
37    NetworkStream();
38    NetworkStream(int nodeType);
39    virtual ~NetworkStream();
40
41    void init();
42
43    void connectToMasterServer(std::string host, int port);
44    void connectToProxyServer(std::string host, int port);
45    void createServer(int port);
46
47    void createNetworkGameManager();
48    void startHandshake(int userId = 0);
49
50    /* synchronizeable interface */
51    void connectSynchronizeable(Synchronizeable& sync);
52    void disconnectSynchronizeable(Synchronizeable& sync);
53
54    inline int getMaxConnections(){ return SharedNetworkData::getInstance()->getMaxPlayer(); }
55
56    /* functions for the peerInfo information retreival */
57    inline bool isUserIdActive( int userID ) { return (peers.find(userID) != peers.end()); }
58    inline bool isUserMasterServer( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isMasterServer(); }
59    inline bool isUserProxyServer( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isProxyServer(); }
60    inline bool isUserClient( int userID ){ if ( !isUserIdActive(userID) ) return false; return peers[userID].isClient(); }
61
62    /* peering interface */
63    inline PeerInfo & getPeerInfo( int userId ) { return peers[userId]; }
64    inline PeerInfo* getPeerInfo() { return this->pInfo; }
65    inline PeerList getPeerInfoList() { return this->peers; }
66
67    /* data processing*/
68    virtual void processData();
69
70    /* debugging */
71    void debug();
72
73
74  private:
75
76    inline SynchronizeableList::const_iterator getSyncBegin(){ return synchronizeables.begin(); }
77    inline SynchronizeableList::const_iterator getSyncEnd(){ return synchronizeables.end(); }
78    void cleanUpOldSyncList();
79    int getSyncCount();
80
81    void updateConnectionList();
82
83    /* handle processes */
84    void handleHandshakes();
85    void handleUpstream( int tick );
86    void handleDownstream(int tick );
87
88    /* handle events*/
89    void handleNewClient( int userId );
90    void handleReconnect( int userId );
91    void handleDisconnect( int userId );
92
93    void writeToNewDict( byte * data, int length, bool upstream );
94
95
96  private:
97    PeerList                   peers;                       //!< list of the network node informations
98
99    PeerInfo*                  pInfo;                       //!< the info about the local peer node (not in the PeerList)
100
101    std::list<int>             freeSocketSlots;             //!< list of free sockets (to ensure not to resycle sockets)
102    int                        currentState;                //!< current state id
103
104    NetworkMonitor*            networkMonitor;              //!< the network monitor
105    NetworkGameManager*        networkGameManager;          //!< reference to the network game manager
106    ServerSocket*              serverSocket;                //!< the listening socket of the server
107
108    std::map<int,int>          oldSynchronizeables;         //!< used to save recently deleted sync ids to not recreate them
109    SynchronizeableList        synchronizeables;            //!< list of the synchronizeables
110
111    byte                       buf[UDP_PACKET_SIZE];        //!< used by handleUp/Downstream
112    byte                       compBuf[UDP_PACKET_SIZE];    //!< used by handleUp/Downstream
113    int                        remainingBytesToWriteToDict; //!< if > 0 NetworkStream will write packets to DATA/dicts/newdict
114
115    int                        dictServer;                  //!< the zip dict for the server
116    int                        dictClient;                  //!< the zip dict for the client
117};
118#endif /* _NETWORK_STREAM */
Note: See TracBrowser for help on using the repository browser.