00001 00002 /* 00003 TelepatiTcp ver 1.5 00004 00005 Copyright (C) 2005 Gilberto Decaro 00006 email: msgid@email.it 00007 00008 This program is free software; you can redistribute it and/or 00009 modify it under the terms of the GNU General Public License 00010 as published by the Free Software Foundation; either version 2 00011 of the License, or (at your option) any later version. 00012 00013 This program is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 GNU General Public License for more details. 00017 00018 You should have received a copy of the GNU General Public License 00019 along with this program; if not, write to the Free Software 00020 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00021 */ 00022 00023 #ifndef TelepatiTcp_h_DEFINED 00024 #define TelepatiTcp_h_DEFINED 00025 00026 #include <OPENR/OObject.h> 00027 #include <OPENR/OSubject.h> 00028 #include <OPENR/OObserver.h> 00029 00030 /*Strutture delle connessioni usate da Telepati*/ 00031 #include "TCPConnection.h" 00032 /*Header per la gestione dello stack TCP/IP di IPStack*/ 00033 #include <ant.h> 00034 /*tipi di Endpoint*/ 00035 #include <EndpointTypes.h> 00036 /*package usati da Telepati i TelepatiPkges*/ 00037 #include <Packages.h> 00038 /*Tipi di messaggi TCP*/ 00039 #include <TCPEndpointMsg.h> 00040 00041 //*** 00042 #include <fstream> 00043 00044 #include <vector> 00045 #include <queue> 00046 #include "def.h" 00047 00050 #include "EtherStat.h" 00051 00054 #define TLPT_BEG_COLOR "\e[32m" 00055 00057 #define TLPT_END_COLOR "\e[0m" 00058 00062 #define TLPT_NAME TLPT_BEG_COLOR"TelepatiTcp"TLPT_END_COLOR 00063 00064 00065 using namespace std; 00070 const char* const AIBONET="/MS/OPEN-R/MW/CONF/AIBONET.CFG"; 00071 00087 class TelepatiTcp : public OObject { 00088 public: 00089 00091 TelepatiTcp(); 00093 virtual ~TelepatiTcp(); 00094 00096 OSubject* subject[numOfSubject]; 00098 OObserver* observer[numOfObserver]; 00099 00103 virtual OStatus DoInit (const OSystemEvent& event); 00107 virtual OStatus DoStart (const OSystemEvent& event); 00110 virtual OStatus DoStop (const OSystemEvent& event); 00114 virtual OStatus DoDestroy(const OSystemEvent& event); 00115 00122 void SendCont(ANTENVMSG msg); 00126 void ReceiveCont(ANTENVMSG msg); 00130 void ListenCont(ANTENVMSG msg); 00135 void ConnectCont(ANTENVMSG msg); 00141 void EtherStat(void* msg); 00142 00149 void SendNotify(const ONotifyEvent& event); 00152 void ObserverReady(const OReadyEvent& event); 00153 00155 static const int TELEPATI_BUFFER_SIZE= 65535; 00159 static const longword TELEPATI_BONE_TIME= 8; 00163 static const int TELEPATI_BASE_PORT= 30000; 00167 static const int TELEPATI_MAX_CONNECT_ERROR= 50; 00171 static const int TELEPATI_MAX_MESSAGE_TO_OBSERVER = 20; 00175 static const longword TELEPATI_RECONNECT_TIME= 800000000; 00176 00177 private: 00178 /*--- Variabili per le statistiche di comunicazione ---*/ 00179 unsigned int sendMessage; /*numero di messaggi spediti*/ 00180 unsigned int totalRecvMessage; /*numero di messaggi totali ricevuti*/ 00181 unsigned int dataRecvMessage; /*numero di messaggi di dati ricevuti*/ 00182 unsigned int byteSended; /*numero di byte spediti*/ 00183 unsigned int byteReceived; /*numero di byte ricevuti*/ 00184 int sendSpeed; /* velcita' di spedizione in byte/s*/ 00185 /* memorizza il momento in cui e' iniziata la spedizione del pkg 00186 della i-esima connessione*/ 00187 SystemTime** startSendTime; 00188 00189 /* Vettore di indirizzi IP degli AIBO*/ 00190 vector<IPAddress> aiboIp; 00191 /* Array di connessioni per la ricezione*/ 00192 TCPRecvConnection* recvConnection; 00193 /* Array di connessioni per la spedizione*/ 00194 TCPSendConnection* sendConnection; 00195 /* Riferimento allo stack IP (richiesto da OPENR)*/ 00196 antStackRef ipstackRef; 00197 /* Stato di attivita' degli aibo presenti. Array di aiboState,in link 00198 con aiboIp*/ 00199 aiboState* aiboIpActive; 00200 /* Numero di aibo presenti nel campo meno 1 (escluso colui su cui 00201 gira Telepati)*/ 00202 int numaibo; 00203 00204 /* Coda di TelepatiPkg. Si occupa della memorizazione dei messaggi 00205 in attesa di essere spediti*/ 00206 queue<TelepatiPkg*> sendQueue; 00207 /* Coda dei messaggi in attesa di essere spediti all'observer.*/ 00208 queue<TelepatiPkg*> interObjectQueue; 00209 00210 /* Array di byte dove l'i-esimo elemento rappresenta il numero di 00211 errori di connessione della i-esima connessione di spedizione. */ 00212 byte* numOfReconnect; 00213 00214 /* Array di buffer di byte contenente "pezzi" di messaggi. Usato in 00215 ReceiveCont per poter riassemblare i messaggi che vengono 00216 tagliati in quanto spediti in due pacchetti TCP differenti.*/ 00217 byte** chunk; 00218 /* Dimensione del buffer chunk.*/ 00219 size_t* chunkSize; 00220 00221 /* Il mio indirizzo IP*/ 00222 IPAddress* myIp; 00223 00224 /* Buffer per il parsing dei file*/ 00225 static const size_t LINEBUFFERSIZE= 256; 00226 00227 /* Parser del file di configurazione. Imposta e inizializza numaibo, 00228 aiboIp, aiboIpActive, numOfReconnect, startSendTime, chunk e 00229 chunkSize e imposta le porte di comunicazione TCP delle varie 00230 connessioni. @return oSUCCESS se ha avuto successo; oFAIL 00231 altrimenti.*/ 00232 OStatus parseIpConfigFile(); 00233 /* Inizializza le connessioni di spedizione e di ricezione. @return 00234 oSUCCESS se ha avuto successo; oFAIL altrimenti.*/ 00235 OStatus initConnections(); 00236 /* Attiva la ricezione della i-esima connessione. @return oSUCCESS 00237 se ha avuto successo; oFAIL altrimenti.*/ 00238 OStatus listen(int i); 00239 /* Connette l'i-esima connessione. @return oSUCCESS se ha avuto 00240 successo; oFAIL altrimenti. */ 00241 OStatus connect(int i); 00242 00243 /* Spedisce il messaggio. Imposta IPStack mandandogli i dati da 00244 spedire attraverso la connessione di spedizione corretta, non 00245 appena il buffer di spedizione di IPStack sara' riempito verra' 00246 invocata SendCont(). In caso la connessione sia in spedizione 00247 accoda il messaggio nella coda sendQueue.@param msg messaggio da 00248 spedire*/ 00249 void send(TelepatiPkg* msg); 00250 00251 /* Avvia la ricezione sulla i-esima connessione. Imposta IPStack in 00252 modo da restare in ascolto sulla rete, non appena verra' ricevuto 00253 un pacchetto verra' invocata la funzione ReceiveCont().*/ 00254 void receive(int i); 00255 00256 /* Fa il merge del buffer contenuto nel messaggio con il buffer di 00257 chunk della i-esima connessione. @param msg messaggio TCP su cui 00258 fare il merge. @param connID id della connessione.*/ 00259 byte* mergeWithChunk(const TCPEndpointReceiveMsg* msg, int connID); 00260 /* Salva nel chunk della connID connessione i byte contenuti in ptr 00261 a partire dall'offset offset. @param ptr buffer contenente i dati 00262 da copiare. @param offset l'offset di ptr da cui iniziare a 00263 copiare i dati. @param size quanti byte copiare. @connID id della 00264 connessione. */ 00265 void saveInChunk(const byte* ptr, int offset, int size, int connID); 00266 00267 /* Manda un ByeMsg (msg di arrivederci) all'i-esimo Aibo; blocca 00268 l'esecuzione dell'oggetto fino al completamento della 00269 spedizione. @param i aibo a cui mandare il byte message*/ 00270 void sendByeMsg(int i); 00271 /* Manda il package agli observer se pronti a riceverlo, altrimenti 00272 lo acconda. @param pkg package da mandare.*/ 00273 void sendToObserver(TelepatiPkg* pkg); 00274 /* Manda un HiMsg (msg di saluto) all'i-esimo Aibo. @param i aibo a 00275 cui mandare l'hy message*/ 00276 inline void sendHiMsg(int i){ 00277 OSYSDEBUG((TLPT_NAME"::sendHiMsg(%d)\n",i)); 00278 send(new HiPkg(i)); 00279 }; 00280 00281 /* Manda un HiReplyMsg (msg di risposta al saluto) all'i-esimo 00282 Aibo. @param i aibo a cui mandare l'HiReply message*/ 00283 inline void sendHiReplyMsg(int i){ 00284 OSYSDEBUG((TLPT_NAME"::sendHiReplyMsg(%d)\n",i)); 00285 send(new HiReplyPkg(i)); 00286 }; 00287 00288 /* Manda un AiboInfoMsg, messaggio di informazione sullo stato degli 00289 Aibo, all'observer di Telepati*/ 00290 void sendAiboInfoMsg(); 00291 /* Manda un CounterPkg all'observer di Telepati*/ 00292 void sendCounterMsg(); 00293 /* Controlla la presenza di messaggi in attesa di essere spediti e, 00294 se presenti, li spedisce.*/ 00295 void checkQueue(); 00296 /* Recupera l'indirizzo IP dell'Aibo stesso*/ 00297 IPAddress* retrieveMyIp(); 00298 /* Imposta l'array aiboIpActive per i-esimo Aibo in base al valore 00299 passato e se cambia ne informa l'observer. @param aibo aibo di 00300 cui modificare lo stato di attivita'. @param newVal nuovo stato 00301 di attivitą. @return true: se ha cambiato stato; false: 00302 altrimenti.*/ 00303 bool setAiboIpActive(int aibo, aiboState newVal); 00304 /* Calcola la velocita' di spedizione, aggiorna e stampa 00305 sendSpeed. @param aibo indice della connessione di spedizione su 00306 cui calcolare la velocita'*/ 00307 void computeSpeed(int aibo); 00308 00309 //*** 00310 ofstream* debugFile; 00311 00312 }; 00313 00314 #endif //TelepatiTcp_h_DEFINED
1.2.14 written by Dimitri van Heesch,
© 1997-2002