00001 /* 00002 * Copyright (C) 2010, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 * Thanks: Jose Renato Santos 00017 * 00018 */ 00019 00020 /////////////////////////////////////////////////////////////////// 00021 // NetInterface.h: headers for NetInterface.cpp 00022 /////////////////////////////////////////////////////////////////// 00023 00024 #ifndef __NETINTERFACE_H_ 00025 #define __NETINTERFACE_H_ 00026 00027 // Unidades usadas do C++ 00028 #include <fstream> 00029 #include <string> 00030 #include <ext/hash_map> 00031 00032 // Unidades usadas do C. 00033 #include <pthread.h> 00034 #include <arpa/inet.h> 00035 00036 // Unidades uadas do RIO. 00037 #include "RioError.h" 00038 #include "RioInterfaceTypes.h" 00039 #include "NetTcp.h" 00040 #include "NetUdp.h" 00041 #include "td4types.h" 00042 00043 // Namespace para usar a STL. 00044 using namespace std; 00045 // Namespace para usar a extensao da STL (o hash_map). Devemos realmente usar 00046 // esta extensao? 00047 using namespace __gnu_cxx; 00048 00049 class CLogRotation; 00050 class CNet; 00051 00052 // Constante para o valor invalido de um identificador de uma transferencia 00053 // (somente para evitar sabermos como a constante e definida na classe). 00054 #define NULLTRANSFERID CTransferInfo::NullTransferID 00055 00056 // Constante para sabermos o tamanho do cabecalho (novamente para evitar 00057 // colocarmos esta informacao no codigo). 00058 #define DATAHEADERSIZE sizeof( SDataHeader ) 00059 00060 // Define um tipo para o ID da estrutura STransferInfo. 00061 // Obs: este valor e um int para ser compativel com o valor reqid usado na 00062 // NetMgr. No futuro, se necessario, podemos usar um valor maior, como um 00063 // unsigned long long int. 00064 typedef int TTransferID; 00065 // Constante usada para a implementação de 64 bis (para converter o int para o 00066 // long e evitar assim um erro). 00067 typedef long TLTransferID; 00068 00069 // Indica se a transferencia e nao definida (UNDEFINEDTYPE), se estamos enviando 00070 // (SENDINGDATA) ou recebendo (RECEIVINGDATA) dados. 00071 // A transferencia nao definida e usada quando nao achamos uma identificacao de 00072 // transferencia, e e usada pela funcao FinalizeAllTransfers da classe 00073 // CTransferInfo, quando desejamos indicar que queremos fechar todas as 00074 // transferencias para um dado par IP, porta. 00075 enum ETransferType 00076 { 00077 UNDEFINEDTYPE, 00078 SENDINGDATA, 00079 RECEIVINGDATA 00080 }; 00081 00082 // Constante com um tempo de timeout default para os comandos send e recv (e o 00083 // mesmo dado no arquivo RioTcp.h para a conexao principal, mas aqui ele e dado 00084 // em milisegundos). 00085 const int NETTCPTIMEOUTSECONDS = 5000; 00086 00087 // Estrutura com as informacoes sobre cada conexao. 00088 typedef struct 00089 { 00090 int IP; // Endereco IP associado a transferencia. 00091 int Port; // Porta associado a transferencia. 00092 TTransferID TransferID; // Identificacao da transferencia associada a 00093 // estrutura (sera que e necessaria?). 00094 callback_t FinalizeCallback; // Callback a ser chamada quando a estrutura 00095 // for removida. 00096 void *FinalizeCallbackParam; // Parametro passado ao chamar a callback 00097 // FinalizeCallback. 00098 cmdcallback_t ProcessCallback; // Callback a ser vhamda quando precisamos 00099 // processar um conjunto de dados antes de 00100 // recebermos os dados definitivos por 00101 // esta transferencia. 00102 void *ProcessCallbackParam; // Parametro passado ao chamar a callback 00103 // ProcessCallback. 00104 char *Data; // Dados associados a transferencia. 00105 unsigned int DataSize; // Quantidade (em bytes) de dados associados a 00106 // transferencia. 00107 TTransferID DestTransferID; // Identificador da transferencia do outro lado 00108 // (usado somente quando enviamos dados). 00109 ETransferType TransferType; // Define se estamos enviando ou recebendo 00110 // dados. 00111 } STransferInfo; 00112 00113 // Nova estrutura com uma funcao para comparar dois identificadores da hash 00114 // que armazena os identificadores. 00115 struct EqTrasnferID 00116 { 00117 bool operator()( const TTransferID ID1, const TTransferID ID2 ) const 00118 { 00119 return ( ID1 == ID2 ); 00120 } 00121 }; 00122 00123 // Novo tipo de hash para o identificador de uma transferencia 00124 typedef hash< TTransferID > TTransferHash; 00125 00126 // Novo tipo para armazenar os ponteiros para as estruturas STransferInfo, com 00127 // uma busca eficiente 00128 typedef hash_map< TTransferID, STransferInfo, TTransferHash, EqTrasnferID > 00129 TTransferInfoHash; 00130 00131 // Possiveis tipos de dados enviados entre o cliente e o servidor. 00132 enum EDataType 00133 { 00134 RSTDATA, // Uma mensagem de erro foi enviada. 00135 CMDDATA, // Um comando foi enviado. 00136 RESULTDATA, // Um resultado (em geral, de um comando) foi enviado. 00137 BLOCKDATA // Um bloco foi enviado.. 00138 }; 00139 00140 // Define os possiveis tipos de comandos (os comandos para o tipo CMDDATA). 00141 #define CMD_TELLID 1 // Atualmente este e o unico tipo de comando 00142 00143 // Define as constantes para cada comando. 00144 // Tamanho do comando CMD_TELLID em unidades do tipo u32. 00145 #define CMD_TELLID_SIZE 4 00146 // Tamanho do comando CMD_TELLID em bytes. 00147 #define CMD_TELLID_BYTESIZE 4 * sizeof( u32 ) 00148 00149 // Estrutura com o cabecalho dos dados enviados. 00150 typedef struct 00151 { 00152 // Tipo dos dados a serem enviados; 00153 uint16_t DataType; 00154 // Identificador da estrutura STransferInfo associada aos dados que estao 00155 // sendo enviados. 00156 uint32_t SourceTransferID; 00157 // Identificador, no outro lado da conexao, da estrutura STransferInfo que 00158 // foi criada para o recebimento destes dados. 00159 uint32_t DataTransferID; 00160 } SDataHeader; 00161 00162 // Classe para armazenar as transferencias em andamento. 00163 class CTransferInfo 00164 { 00165 private: 00166 // Ponteiro para o objeto da classe de gerenciamento associada a este 00167 // objeto de envio dos dados. 00168 CNetInterface *m_NetInterface; 00169 // Define o proximo numero usado para identificar a proxima estrutura a 00170 // ser criada pela funcao NewTransfer. 00171 TTransferID m_NextTransferID; 00172 // hash para buscar, pela identificacao da transferencia, uma das 00173 // transferencias (talvez possamos fazer igual a RioNeti e usar uma 00174 // hash). 00175 TTransferInfoHash m_TransferInfoHash; 00176 // mutex para garantir o acesso exclusivo as estruturas de um objeto 00177 // da classe. 00178 pthread_mutex_t m_Mutex; 00179 00180 /** 00181 * Funcao para achar o ID TransferID na hash. 00182 * @param TransferID ID a ser buscada. 00183 * @return iterador para na hash para o ID se o ID for valido e existir 00184 * na hash, ou m_TransferInfoHash.end() em caso contrario. 00185 */ 00186 TTransferInfoHash::iterator FindTransferID( TTransferID TransferID ); 00187 00188 public: 00189 // Constante usada para sabermos se a ID de uma transferencia e ou nao 00190 // valida. 00191 static const TTransferID NullTransferID = -1; 00192 00193 /** 00194 * Construtor da classe, usado para criar um novo objeto desta classe. 00195 * @param ponteiro para o objeto da classe CNetInterface que gerencia 00196 * as transferencias. 00197 */ 00198 CTransferInfo( CNetInterface *NetInterface ); 00199 00200 /** 00201 * Destrutor da classe, usado para remover um objeto desta classe 00202 * criado anteriormente. 00203 */ 00204 ~CTransferInfo(); 00205 00206 /** 00207 * Funcao para criar uma nova estrutura para gerenciar uma transferencia 00208 * @param IP endereco IP associado a nova transferencia. 00209 * @param Port Porta associada a nova transferencia. 00210 * @param FinalizeCallback callback chamada quando finalizamos a 00211 * transferencia. 00212 * @param FinalizeCallbackParam valor a ser passado quando chamarmos a 00213 * callback FinalizeCallback. 00214 * @param ProcessCallback callback chamada para processar um dado 00215 * recebido. Neste caso, a transrencia nao sera finalizada, e um novo 00216 * dado devera ser recebido para finaliza-la (esta callback somente e 00217 * chamada para os dados do tipo CMDDATA). 00218 * @param ProcessCallbackParam valor a ser passado quando chamarmos a 00219 * callback ProcessCallback. 00220 * @param Data dados associados a estrutura de transferencia a ser 00221 * criada. 00222 * @param DataSize numero de bytes nos dados associados a transferencia. 00223 * @param TransferType tipo da transferencia: se estamos enviando dados 00224 * (SENDINGDATA) ou se estamos recebendo dados (RECEIVINGDATA). 00225 * @param DestTransferID Identificador da transferencia de destino. Ele 00226 * e usado somente quando enviamos dados, e diz qual e a identificacao 00227 * da transferencia, no outro lado, que recebera os dados. Atualmente, 00228 * e somente usado quando finalizamos as conexoes ou quando ocorre um 00229 * erro ao escrevermos os dados. 00230 * @param TransferID ponteiro para um valor que recebera a ID associada 00231 * a transferencia (usado para buscar pela estrutura associada a esta 00232 * transferencia). Se for NULL, o 00233 * identificador nao sera armazenado. 00234 * @return S_OK se a estrutura para a transferencia foi criada com 00235 * sucesso ou o codigo de erro se algum erro ocorrer. 00236 */ 00237 RioResult NewTransfer( int IP, int Port, callback_t FinalizeCallback, 00238 void *FinalizeCallbackParam, 00239 cmdcallback_t ProcessCallback, 00240 void *ProcessCallbackParam, char *Data, 00241 unsigned int DataSize, 00242 ETransferType TransferType, 00243 TTransferID DestTransferID, 00244 TTransferID *TransferID = NULL ); 00245 00246 /** 00247 * Funcao para remover uma estrutura de transferencia. 00248 * @param TransferID ID da transferencia a ser removida. 00249 * @return S_OK se a estrutura da transferencia foi removida com 00250 * sucesso, ou o codigo do erro caso algum erro tenha ocorrido. 00251 */ 00252 RioResult RemoveTransfer( TTransferID TransferID ); 00253 00254 /** 00255 * Funcao para buscar por uma estrutura de transferencia cuja ID e 00256 * passada como parametro, e retornar as informacoes sobre esta 00257 * transferencia 00258 * @param TransferID identificador para a transferencia que desejamos 00259 * obter os dados passados a funcao NewTransfer quando a estrutura para 00260 * a transferencia foi criada. 00261 * @param IP ponteiro para o endereco para armazenar o endereco IP 00262 * associado a nova transferencia. 00263 * @param Port ponteiro para o endereco para armazenar a porta associada 00264 * a nova transferencia. 00265 * @param FinalizeCallback ponteiro para o endereco da callback chamada 00266 * quando finalizamos a transferencia. 00267 * @param FinalizeCallbackParam ponteiro para o valor a ser passado 00268 * quando chamarmos a callback FinalizeCallback. 00269 * @param ProcessCallback ponteiro para o endereco da callback chamada 00270 * para processar um dado. 00271 * @param ProcessCallbackParam ponteiro para o valor a ser passado 00272 * quando chamarmos a callback FinalizeCallback. 00273 * @param Data ponteiro para armazenar o ponteiro para os dados 00274 * associados a estrutura de transferencia a ser criada. 00275 * @param DataSize ponteiro para armazenar o numero de bytes nos dados 00276 * associados a transferencia. 00277 * @param TransferType ponteiro para armazenar o tipo da transferencia: 00278 * se estamos enviando dados (SENDINGDATA) ou se estamos recebendo dados 00279 * (RECEIVINGDATA). 00280 * @param DestTransferID ponteiro para armazenar a identificacao da 00281 * transferencia associada a um envio de dados. Se for NULL (o default, 00282 * se nao for passado), a ID nao sera retornada (fizemos isso porque, 00283 * atualmente, somente a funcao ProcessError da classe CNetInterface 00284 * esta usando este ID, quando ocorre um erro no envio dos dados, para 00285 * avisar o erro ao outro lado da conexao). 00286 * @return S_OK se a estrutura para a transferencia foi criada com 00287 * sucesso ou o codigo de erro se algum erro ocorrer. 00288 */ 00289 RioResult GetTransfer( TTransferID TransferID, int *IP, int *Port, 00290 callback_t *FinalizeCallback, 00291 void **FinalizeCallbackParam, 00292 cmdcallback_t *ProcessCallback, 00293 void **ProcessCallbackParam, char **Data, 00294 unsigned int *DataSize, 00295 ETransferType *TransferType, 00296 TTransferID *DestTransferID = NULL ); 00297 00298 /** 00299 * Funcao para chamar todas as callbacks de finalizacao da transferencia 00300 * para as transferencias associadas ao par IP, porta passado como 00301 * parametro, e depois remover todas as estruturas de transferencia 00302 * associadas ao mesmo par IP, porta. As callbacks serao finalizadas com 00303 * o erro passado como parametro. 00304 * 00305 * Obs: Se o ponteiro para os dados passados ao criarmos a estrutura 00306 * para a transferencia nao for NULL, entao os dados tambem serao 00307 * removidos. 00308 * Obs2: se IP e Port foram ambos 0, todas as transferencias serao 00309 * finalizadas (esta chamada e usada pelo destrutor da classe para 00310 * garantir que todas as transferencias foram finalizadas). 00311 * 00312 * @param IP endereco IP para o qual desejamos finalizar todas as 00313 * transferencias que estao pendentes. 00314 * @param Port porta para a qual desejamos finalizar todas as 00315 * transferencias pendentes. 00316 * @param TransferType tipo de transferencia que desejamos fechar. Se 00317 * for igual a UNDEFINEDTYPE, todas as transferencias (de leitura e 00318 * de escrita) serao fechadas. Caso contrario, somente as transferencias 00319 * do tipo dado serao fechadas. 00320 * @param RioError erro a ser passado quando as callbaks forem chamadas. 00321 * @return S_OK se as estruturas de transferencia associadas ao par IP, 00322 * porta foram removidas com sucesso ou o codigo de erro em caso 00323 * contrario (note que as callbacks nao gerarao erros porque sao funcoes 00324 * cujo retorno e do tipo void). 00325 */ 00326 RioResult FinalizeAllTransfers( int IP, int Port, 00327 ETransferType TransferType, 00328 RioResult RioError ); 00329 }; 00330 00331 // Estrutura com as informacoes necessarias ao processamento da funcao 00332 // ExpectTellId da classe CNetInterface (usada quando enviamos blocos aos 00333 // servidores de armazenamento). 00334 typedef struct 00335 { 00336 // Endereco dos dados (um bloco) a ser enviados aos servidores de 00337 // armazenamento dos quais receberemos uma ID de transferencia. 00338 char *Buffer; 00339 // Tamanho dos dados (um bloco) a serem enviados (em bytes). 00340 unsigned int BufferSize; 00341 // Armazena a callback a ser chamada apos todas as IDs de transferencias dos 00342 // servidores de armazenamento serem recebidas e todos os blocos serem 00343 // enviados (note que e enviado um bloco por replicacao). 00344 callback_t callback; 00345 // Parametro a ser chamado quando a callback e chamada. 00346 void *callbackparm; 00347 // Identificador da transferencia responsavel por receber as IDs dos 00348 // servidores de armazenamento e enviar os blocos (criada pela funcao 00349 // ExpectTellID). 00350 TTransferID SentDataTransfer; 00351 // Ponteiro para o objeto da classe CNetInterface no qual as IDs serao 00352 // processadas. 00353 CNetInterface *NetInterface; 00354 } TTellIdData; 00355 00356 // Classe para gerenciar o envio de dados. 00357 class CNetInterface 00358 { 00359 private: 00360 // Variavel booleana para indicar se a classe nao foi inicializada. 00361 bool m_Started; 00362 // Ponteiro para o objeto da classe de Rede responsavel por enviar dados 00363 // pelas conexoes TCP. 00364 CNetTcp *m_NetTcp; 00365 // Ponteiro para o objeto da classe de Rede responsavel por enviar dados 00366 // pelas conexoes TCP. 00367 CNetUdp *m_NetUdp; 00368 // Ponteiro para o objeto da classe que gerencia as transferencias em 00369 // andamento. 00370 CTransferInfo *m_TransferInfo; 00371 // Mutex para garantir o acesso exclusivo ao mapa m_TransferInfoMap. 00372 pthread_mutex_t m_MapMutex; 00373 00374 /** 00375 * Funcao usada para criar e inicializar o objeto derivado da classe 00376 * classes CNetTcp. 00377 * @param NetConfig estrutura com as configuracoes do objeto a ser 00378 * criado da classe CNetTcp. 00379 * @return S_OK se a criacao e inicializao do objeto foi feita com 00380 * sucesso ou false se algum erro ocorreu. 00381 */ 00382 RioResult StartNetTcp( SNetTcpConfig *NetConfig ); 00383 00384 /** 00385 * Funcao usada para criar e inicializar o objeto derivado da classe 00386 * classes CNetUdp. 00387 * @param NetConfig estrutura com as configuracoes do objeto a ser 00388 * criado da classe CNetUdp. 00389 * @return S_OK se a criacao e inicializao do objeto foi feita com 00390 * sucesso ou false se algum erro ocorreu. 00391 */ 00392 RioResult StartNetUdp( SNetUdpConfig *NetConfig ); 00393 00394 /** 00395 * Funcao usada para criar um novo objeto da classe CTransferInfo. 00396 * @return S_OK se a criacao e inicializao do objeto foi feita com 00397 * sucesso ou false se algum erro ocorreu. 00398 */ 00399 RioResult StartTransferInfo(); 00400 00401 /** 00402 * Funcao para criar uma nova estrutura de transferencia e enviar os 00403 * dados passados como parametro, anexando no inicio dos dados o 00404 * cabecalho que informa o tipo de dados (passado como parametro) e o 00405 * identificador da transferencia do outro lado da conexao para a qual 00406 * os dados serao enviados. 00407 * @param IP endereco destino dos dados. 00408 * @param Port porta no endereco destino para a qual os dados serao 00409 * enviados. 00410 * @param FinalizeCallback callback chamada quando finalizamos a 00411 * transferencia. 00412 * @param CallbackParam valor a ser passado quando chamarmos a callback 00413 * FinalizeCallback. 00414 * @param Data ponteiro para os dados a serem enviados. 00415 * @param DataSize numero de bytes nos dados a serem enviados. 00416 * @param DataType tipo dos dados (ver o tipo EDataType). 00417 * @param DestTransferID identificador associado ao envio destes dados 00418 * no outro lado da conexao (ou seja, o identificador no IP, porta 00419 * destino associado aos dados que serao enviados). 00420 * @param UseTCP se true os dados devem ser enviados usando o objeto da 00421 * classe CNetTCP e, se false, devem ser enviados usando o objeto da 00422 * classe CNetUDP. 00423 * @param TransferID ponteiro para armazenar o identificador associado 00424 * a estrutura criada para o envio dos dados. Se for NULL, o 00425 * identificador nao sera armazenado. 00426 * @return S_OK se os dados foram criados e colocados com sucesso para 00427 * serem enviados na fila do socket do par IP, porta passado como 00428 * parametro, ou o codigo de erro de algo der errado. 00429 */ 00430 RioResult SendData( int IP, int Port, callback_t FinalizeCallback, 00431 void *FinalizeCallbackParam, char *Data, 00432 unsigned int DataSize, EDataType DataType, 00433 bool UseTCP, TTransferID DestTransferID, 00434 TTransferID *TransferID = NULL ); 00435 00436 /** 00437 * Funcao de callback usada pela funcao ExpectTellId para processar os 00438 * identificadores recebidos dos servidores de armazenamento e enviar, 00439 * usando estes identificadores, os blocos para os servidores de 00440 * armazenamento. 00441 * @param CmdParam parametro passado quando a funcao ExpectCmd foi 00442 * chamada em ExpectTellId (um ponteiro para uma estrutura do tipo 00443 * TTellIdData). 00444 * @param Command comando (enviado pela funcao TellId) recebido de um 00445 * servidor de armazenamento. 00446 * @param CommandSize tamanho em bytes do comando. 00447 */ 00448 static void ProcessTransferIDs( void *CmdParam, char *Command, 00449 int CommandSize ); 00450 00451 /** 00452 * Funcao de callback chamada quando uma estrutura de transferencia 00453 * associada ao envio dos blocos aos servidores de armazenamento 00454 * (criada pela chamada ExpectTellId) receber uma mensagem do tipo 00455 * RESULTDATA do servidor de despacho informando que todos os 00456 * servidores de armazenamento reportaram que receberam o bloco 00457 * (corretamente ou nao). 00458 * 00459 * Obs: A callback passada originalmente a funcao ExpectTellId sera 00460 * chamada se isResultReceived for true (indicando que a chamada 00461 * FinalizeSendBlocks foi executada) e se SentBlockCount for 0 00462 * (indicando que recebemos a confirmacao de envio do bloco para cada 00463 * servidor de armazenamento que enviou uma ID de transferencia). Esta 00464 * verificacao e feita aqui e na funcao SendBlockCompleted para 00465 * evitarmos dependencia da ordem do recebimento da mensagem RESULTDATA 00466 * e das confirmacoes do recebimento dos blocos). 00467 * 00468 * @param Param parametro passado quando a funcao ExpectTellId foi 00469 * chamada (mais uma vez um ponteiro para uma estrutura do tipo 00470 * TTellIdData). 00471 * @param Result resultado do recebimento do dado com um resultado 00472 * (S_OK ou o codigo do erro caso tenha ocorrido algum erro receber o 00473 * dado com o resultado). 00474 */ 00475 static void FinalizeSendBlocks( void *Param, int Result ); 00476 /** 00477 * Funcao para descobrir, dentre todas as interfaces de rede da maquina, 00478 * a que tiver um IP diferente de 127.0.0.1. Se nao existir uma 00479 * interface com um IP diferente deste, entao este IP sera retornado. 00480 * Obs: O codigo desta funcao foi copiado da RioNeti. Depois podemos ver 00481 * se existe um modo melhor de fazer a mesma tarefa. 00482 * @param IP ponteiro para o endereco no qual o IP sera armazenado. 00483 * @return S_OK se nenhum erro ocorreu ao descobrir a interface, ou o 00484 * codigo de erro indicando o erro que ocorreu. 00485 */ 00486 RioResult FindIP( int *IP ); 00487 00488 public: 00489 // O seguinte membro estÔtico também deve ser declarados no arquivo 00490 // NetInterface.cpp, fora da classe CNetInterface. 00491 #ifdef RIO_DEBUG_FILE 00492 static ofstream m_log; 00493 #else 00494 static debugCerr m_log; 00495 #endif 00496 00497 /** 00498 * Construtor da classe CNetInterface, usado para criar um novo objeto 00499 * da classe. 00500 */ 00501 CNetInterface(); 00502 00503 /** 00504 * Destrutor da classe CNetInterface, usado para deletar um objeto da 00505 * classe. 00506 */ 00507 ~CNetInterface(); 00508 00509 /** 00510 * Funcao usada para inicializar a classe usada pelo cliente. 00511 * @param ServerAddress vetor de estruturas (do tipo sockaddr_in) com os 00512 * enderecos (IP, porta) dos servidores com os quais o cliente deve 00513 * criar uma conexao (este parametro e ignorado para as conexoes UDP, 00514 * ou seja, se UseTcp for igual a false). 00515 * @param ServerAddressSize numero de enderecos no vetor ServerAddress. 00516 * @param ConnectionTimeOut timeout (em segundos) para uma conexao entre 00517 * o cliente e um dos servidores (usado somente pelas conexoes TCP). 00518 * @param ReceiveTimeOut timeout (em milisegundos) para os comandos de 00519 * recebimento de dados (recv). 00520 * @param SendTimeOut timeout (em milisegunfod) para os comandos de 00521 * envio de dados (send). 00522 * @param LogPath caminho do arquivo usado para armazenar os logs dos 00523 * envio de dados. Se usarmos o parametro default NULL, as impressoes 00524 * serao colocadas na RioErr. Em caso contrario, o nome do do arquivo 00525 * sera RIOClientEmul_<maquina>.<dominio>.log. Este parametro, assim 00526 * como na classe NetMgr e RioNeti, somente estara disponivel se a 00527 * constante RIO_DEBUG_FILE for usada. 00528 * @return S_OK se nenhum erro ocorreu ao inicializar a classe, ou o 00529 * erro em caso contrario. 00530 */ 00531 #ifdef RIO_DEBUG_FILE 00532 RioResult Start( struct sockaddr_in *ServerAddress, 00533 unsigned int ServerAddressSize, 00534 time_t ConnectionTimeOut = 0, 00535 unsigned int ReceiveTimeOut = 0, 00536 unsigned int SendTimeOut = 0, 00537 const char *LogPath = NULL ); 00538 #else 00539 RioResult Start( struct sockaddr_in *ServerAddress, 00540 unsigned int ServerAddressSize, 00541 time_t ConnectionTimeOut = 0, 00542 unsigned int ReceiveTimeOut = 0, 00543 unsigned int SendTimeOut = 0 ); 00544 #endif 00545 00546 /** 00547 * Funcao usada para inicializar a classe usada pelo servidor ou 00548 * o storage. 00549 * @param ServerPort porta TCP a qual devemos no conectar (este 00550 * parametro somente e usado pelos servidores). 00551 * @param ConnectionTimeOut timeout (em segundos) para uma conexao entre 00552 * o cliente e um dos servidores (usado somente pelas conexoes TCP). 00553 * @param ReceiveTimeOut timeout (em milisegundos) para os comandos de 00554 * recebimento de dados (recv). 00555 * @param SendTimeOut timeout (em milisegunfod) para os comandos de 00556 * envio de dados (send). 00557 * @param LogRotation ponteiro para o objeto que gerencia o 00558 * armazenamento dos logs de envio de dados pelo servidor (de 00559 * armazenamento). 00560 * @param isStorage usado para indicar se o objeto esta associado a um 00561 * servidor de despacho (false) ou a um servidor de armazenamento 00562 * (true). Esta parametro somente e usado com o parametro LogPath para 00563 * podermos criar um nome diferenciado para o servidor de despacho e 00564 * para o servidor de armazenamento. 00565 * @param LogPath caminho do arquivo usado para armazenar os logs dos 00566 * envio de dados. Se usarmos o parametro default NULL, as 00567 * impressoes serao colocadas na RioErr. Em caso contrario, o nome do 00568 * do arquivo sera gerado segundo o seguinte criterio: 00569 * RIOServerEmul_<maquina>.<dominio>.log se o servidor de despacho 00570 * executou a funcao. 00571 * RIOStorageEmul_<maquina>.<dominio>.log se o servidor de armazenamento 00572 * executou a funcao. 00573 * 00574 * Obs: Este parametro, assim como na classe NetMgr e RioNeti, somente 00575 * estara disponivel se a constante RIO_DEBUG_FILE for usada. 00576 * @return S_OK se nenhum erro ocorreu ao inicializar a classe, ou o 00577 * erro em caso contrario. 00578 * Obs2: Devido a ser usado para criar um nome para o log, o parametro 00579 * isStorage tambem somente e usado quando a constante RIO_DEBUG_FILE 00580 * for usada. 00581 */ 00582 #ifdef RIO_DEBUG_FILE 00583 RioResult Start( int ServerPort, time_t ConnectionTimeOut = 0, 00584 unsigned int ReceiveTimeOut = 0, 00585 unsigned int SendTimeOut = 0, 00586 CLogRotation *LogRotation = NULL, 00587 bool isStorage = false, const char *LogPath = NULL ); 00588 #else 00589 RioResult Start( int ServerPort, time_t ConnectionTimeOut = 0, 00590 unsigned int ReceiveTimeOut = 0, 00591 unsigned int SendTimeOut = 0, 00592 CLogRotation *LogRotation = NULL ); 00593 #endif 00594 00595 /** 00596 * Funcao para parar o funcionamento do objeto da classe, parando todas 00597 * as threads que tenham sido criadas por um objeto de uma das classes 00598 * derivadas da CNet e tambem todas as estruturas alocadas. 00599 * @return S_OK se nenhum erro ocorreu ao parar a classe, ou o codigo do 00600 * erro em caso contrario. 00601 */ 00602 RioResult Stop(); 00603 00604 /** 00605 * Funcao para obter o IP e a porta do servidor passado como parametro. 00606 * Por default, sera obtido o par IP, porta do servidor com o 00607 * identificador 0 (no caso do cliente, o par IP, porta do cliente no 00608 * servidor de despacho). 00609 * @param ipaddr ponteiro para armazenar o endereco IP. 00610 * @param port ponteiro para armazenar a porta. 00611 * @param server identificador do servidor para o qual desejamos obter 00612 * o par IP, porta. Para o servidor, qualquer valor diferente de 0 nao 00613 * retornara valores. Para o cliente, o valor 0 se refere ao servidor 00614 * de despacho e os valores de 1 ate o numero de servidores de 00615 * armazenamento a cada um dos servidores de armazenamento (na mesma 00616 * ordem em que eles estao no arquivo de configuracao do servidor de 00617 * despacho, mas o cliente nao precisa saber disso). 00618 */ 00619 void getmyaddrport( int *ipaddr, int *port, int server = 0 ); 00620 00621 /** 00622 * Funcao para retornar os pares IP, porta associados ao objeto da 00623 * classe. Se o objeto estiver associado a um cliente, entao todos os 00624 * pares IP, porta do cliente nos servidores serao retornados. Caso o 00625 * objeto esteja associado ao servidor, sera retornado um ponteiro para 00626 * um inteiro com o IP do servidor e um outro ponteiro para um inteiro 00627 * com a porta na qual os clientes devem se conectar ao servidor. 00628 * @param ipaddr ponteiro para armazenar os enderecos IPs. 00629 * @param port ponteiro para armazenar as portas. 00630 */ 00631 void getalladdrport( int **ipaddr, int **port ); 00632 00633 /** 00634 * Funcao para retornar o endereco IP associado ao objeto da classe. No 00635 * caso do cliente, sera retornado o IP associado ao servidor de 00636 * despacho e, no caso do servidor, o IP associado ao servidor. 00637 * @return endereco IP associado ao objeto da classe. 00638 */ 00639 int getipaddr(); 00640 00641 00642 /** 00643 * Funcao para enviar uma mensagem do tipo comando ao endereco ipadr, 00644 * port destino, passando o comando dado em cmdp (com o tamanho de 00645 * cmdl). 00646 * @param ipadr endereco IP para o qual o comando deve ser enviado. 00647 * @param port porta para o qual o comando deve ser enviado. 00648 * @param TransferID identificador da estrutura de transferencia no 00649 * endereco destino associada ao recebimento do comando a ser enviado. 00650 * @param cmdp ponteiro para o comando a ser enviado. 00651 * @param cmdl tamanho do comandio a ser enviado. 00652 * @param callback callback a ser chamada quando o comando foi enviado 00653 * com sucesso ao outro lado? Ele nao espera por um result? 00654 * @param callbackparm parametro a ser passado a callback quando ela for 00655 * chamada. 00656 */ 00657 void SendCmd( int ipadr, int port, TTransferID TransferID, char *cmdp, 00658 int cmdl, callback_t callback, void *callbackparm ); 00659 00660 /** 00661 * Funcao para enviar uma mensagem do tipo resultado ao endereco ipadr, 00662 * port destino, passando o resultado dado em result. 00663 * @param ipadr endereco IP para o qual o comando deve ser enviado. 00664 * @param port porta para o qual o comando deve ser enviado. 00665 * @param TransferID identificador da estrutura de transferencia no 00666 * endereco destino associada ao recebimento do resultado a ser enviado. 00667 * @param result resultado a ser passado. 00668 */ 00669 void SendResult( int ipadr, int port, TTransferID TransferID, 00670 int result ); 00671 00672 /** 00673 * Funcao para enviar um bloco de um dos arquivos armazenados em um dos 00674 * storages do RIO, ou para enviar um bloco de um arquivo resultante de 00675 * uma busca nos logs, para o par ipadr, port do destino. 00676 * @param ipadr endereco IP para o qual o bloco deve ser enviado. 00677 * @param port porta para o qual o bloco deve ser enviado. 00678 * @param TransferID identificador da estrutura de transferencia no 00679 * endereco destino associada ao recebimento do bloco a ser enviado. 00680 * @param bufadr endereco com os dados do bloco. 00681 * @param buflen tamanho do bloco em bytes. 00682 * @param callback callback a ser chamada quando o bloco for enviado com 00683 * sucesso ao destino. 00684 * @param callbackparm parametro a ser passado pela callback. 00685 * @param UseTCP valor booleano que, se false, indica que o bloco 00686 * deve ser enviado em tempo real (via UDP sem retransmissao) e, se for 00687 * true, indica que o bloco deve ser enviado em tempo nao real (usando 00688 * a conexao TCP). Este paramtro e opcional e tem o valor default de 00689 * true (usar a conexao TCP). 00690 * @param VideoRate taxa de transmissao do video (somente nas 00691 * transferencias em tempo real). A taxa define define, caso estejamos 00692 * estejamos enviando trafego em tempo real (os videos) a taxa de 00693 * transmissao do video em Kbps. Como ele somente e usado pelo servidor 00694 * de armazenamento, ele possui um valor default de 0, para que nao 00695 * seja necessario alterarmos o codigo do cliente e do servidor de 00696 * despacho. 00697 * 00698 * Obs: O que vamos fazer neste caso da transferencia em tempo real? 00699 * O metodo que pensamos antes de criar uma classe abstrata pode nao ser 00700 * adequado, pois nao sei se sera possivel simular a transferencia em 00701 * tempo real e o multicast usando o TCP e, se isso for verdade, 00702 * precisaremos criar objetos das duas classes (CNetTcp e CNetUdp) e 00703 * avaliarmos o que vamos fazer em casos de conflido do uso dos objetos 00704 * das duas classes (por exemplo, isso ocorrera com as funcoes que obtem 00705 * os pares IP,porta descritas anteriormente). 00706 * Obs2: Por enquanto, somente as copias em tempo nao real serao feitas 00707 * pela funcao. As outras copias chamarao imediatamente a callback com 00708 * o erro ERROR_NETINTERFACE + ERROR_INVALID_TRAFFIC (o erro que 00709 * identifica a classe mais o erro de trafego invalido). 00710 */ 00711 void SendBlock( int ipadr, int port, TTransferID TransferID, 00712 char *bufadr, int buflen, callback_t callback, 00713 void *callbackparm, bool UseTCP = true, 00714 unsigned int VideoRate = 0 ); 00715 00716 /** 00717 * Funcao para criar uma nova estrutura de transferencia para esperar 00718 * por um bloco a ser enviado pelo outro lado da conexao. 00719 * @param buf ponteiro para o lugar onde o bloco, quando recebido, sera 00720 * armazenado. 00721 * @param len tamanho em blocos do bloco que estamos esperando. 00722 * @param callback callback a ser chamada quando o bloco for recebido. 00723 * @param callbackparm parametro a ser passado a callback 00724 * @param sendack se um ack deve ou nao ser enviado. Como a copia TCP 00725 * nao possui acks por nao dividir o bloco em fragmentos (como fara a 00726 * copia em UDP com retransmissao, se implementarmos), este parametro 00727 * sera ignorado e somente estara aqui porque pode ser futuramente 00728 * usado). 00729 * @param IP endereco IP para o qual o bloco deveria ter sido enviado 00730 * (este parametro novo possui um valor default de 0, para 00731 * compatibilidade com as chamadas anteriores). 00732 * @param Port porta para a qual o bloco deveria ter sido enviado (este 00733 * parametro novo possui um valor default de 0, para compatibilidade 00734 * com as chamadas anteriores). 00735 * @return identificador da estrutura de trasnferencia criada que sera 00736 * associada ao bloco a ser recebido. 00737 */ 00738 TTransferID ExpectBlock( char *buf, int len, callback_t callback, 00739 void *callbackparm, int sendack = 1, 00740 int IP = 0, int Port = 0 ); 00741 00742 /** 00743 * Cancela a espera por dados em uma estrutura de transferencia criada 00744 * anteriormente (sem chamar a callback). 00745 * @param TransferID identificador da transferencia a ser cancelada. 00746 * @param result eu nao tenho certeza deste parametro, mas ele parece 00747 * que nao foi usado mas passaria, se a callback fosse chamada ao 00748 * cancelarmos a transferencia, o motivo do cancelamento. A funcao da 00749 * RioNeti nao usa este parametro. 00750 * @return 0 se algum erro ocorreu (possivelmente uma ID invalida) ou 1 00751 * em caso de sucesso. Como o retorno e ignorado em todos os lugares 00752 * que 00753 */ 00754 int CancelExpect( TTransferID TransferID, int result ); 00755 00756 /** 00757 * Envia ao outro lado da conexao, usando um comando, as informacoes 00758 * necessarias para que este lado envie um bloco. 00759 * @param ipadr endereco IP para onde a ID deve ser enviada. 00760 * @param port porta neste endereco para onde a ID deve ser enviada. 00761 * @param TransferID identificador da estrutura de transferencia no 00762 * endereco destino associada ao recebimento do comando com a ID que 00763 * devera ser processado. 00764 * @param tellip endereco IP (local?) informando, ao outro lado, para 00765 * onde o bloco deve ser enviado quando o comando com a ID for recebido. 00766 * @param tellport porta (local?) informando, ao outro lado, para 00767 * onde o bloco deve ser enviado quando o comando com a ID for recebido. 00768 * @param tellTransferID identificador da estrutura de transferencia 00769 * (local) assiada ao bloco a ser recebido pelo outro lado depois de a 00770 * ID ser processada. 00771 * @param callback callback a ser chamada quando o processamento do 00772 * comando que envia as informacoes terminar. 00773 * @param callbackparm parametro a ser passado quando a callback for 00774 * chamada. 00775 */ 00776 void TellId( int ipadr, int port, TTransferID TransferID, 00777 int tellip, int tellport, TTransferID tellTTransferID, 00778 callback_t callback, void *callbackparm ); 00779 00780 /** 00781 * Funcao para esperar por um bloco vindo do outro lado da conexao. 00782 * @param ipadr endereco IP para onde a ID deve ser enviada. 00783 * @param port porta neste endereco para onde a ID deve ser enviada. 00784 * @param TransferID identificador da estrutura de transferencia no 00785 * endereco destino associada ao recebimento do comando com a ID que 00786 * devera ser processado. 00787 * @param bufadr ponteiro para o endereco que armazenara o bloco 00788 * recebido do outro lado. 00789 * @param buflen tamanho esperado para o bloco. 00790 * @param callback callback a ser chamada quando o bloco for recebido. 00791 * @param callbackparm parametro a ser passado quando a callback for 00792 * chamada. 00793 */ 00794 void GetBlock( int ipadr, int port, TTransferID TransferID, 00795 char *bufadr, int buflen, callback_t callback, 00796 void *callbackparm ); 00797 00798 /** 00799 * Funcao para esperar por IDs enviadas por cada servidor de 00800 * armazenamento, quando enviamos blocos para o sistema RIO. Recebemos 00801 * diversas IDs porque precisamos enviar um bloco para cada replicacao. 00802 * @param buf ponteiro com os dados do bloco a ser enviado. 00803 * @param len tamanho em bytes do bloco. 00804 * @param callback callback a ser chamada quando todos os blocos forem 00805 * enviados com sucesso. 00806 * @param callbackparm parametro a ser passado quando a callback for 00807 * chamada 00808 * @param IP endereco IP para o qual o bloco deveria ter sido enviado 00809 * (este parametro novo possui um valor default de 0, para 00810 * compatibilidade com as chamadas anteriores). 00811 * @param Port porta para a qual o bloco deveria ter sido enviado (este 00812 * parametro novo possui um valor default de 0, para compatibilidade 00813 * com as chamadas anteriores). 00814 * @return identificador da estrutura criada que sera associada ao 00815 * bloco a ser recebido. 00816 */ 00817 TTransferID ExpectTellId( char *buf, int len, callback_t callback, 00818 void *callbackparm, int IP = 0, 00819 int Port = 0 ); 00820 00821 /** 00822 * Funcao usada para imprimir um buffer (em geral, dados recebidos pela 00823 * conexao). 00824 * @param label string a ser impressa antes do conteudo do pacote. 00825 * @param data dados do pacote a serem impressos 00826 * @param datal tamanho em bytes dos dados. 00827 */ 00828 static void dumppkt( const char *label, char *data, int datal ); 00829 00830 /** 00831 * Funcao para informar que nao desejamos mais esperar por um bloco 00832 * enviado por tempo real e que a callback passada ao receber o 00833 * bloco deve ser chamada mesmo que todos os fragmentos nao tenham ainda 00834 * sido recebidos. 00835 * 00836 * Obs: Como ainda nao implementamos a classe CNetUdp, que sera a 00837 * responsavel pela copia em tempo real, esta funcao ira retornar 0 00838 * se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo 00839 * usado. 00840 * 00841 * @param block_id identificador do bloco (provavelmente o identificador 00842 * da estrutura de transferencia associada ao recebimento deste bloco). 00843 * @param traffic tipo de trafego (UNICASTTRAFFIC ou MULTICASTTRAFFIC). 00844 * @return numero de bytes recebidos do bloco. 00845 */ 00846 int FreeBlock( unsigned int block_id, RioStreamType traffic ); 00847 00848 /** 00849 * Funcao para informar que nao desejamos mais esperar por um conjunto 00850 * de blocos dado em nBuffers enviados em tempo real e que cada callback 00851 * passada associada a cada bloco da cache deve ser chamada. 00852 * 00853 * Obs: Como ainda nao implementamos a classe CNetUdp, que sera a 00854 * responsavel pela copia em tempo real, esta funcao ira retornar 0 00855 * se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo 00856 * usado. 00857 * 00858 * @param useCache valor booleando indicando se estamos usando ou nao 00859 * uma cache de blocos. 00860 * @param nBuffers buffer com as informacoes dos blocos para os quais 00861 * nao desejamos mais esperar. 00862 * @return soma dos tamanhos dos bytes recebidos em cada bloco. 00863 */ 00864 int FreePendentBlocks( bool useCache, int nBuffers ); 00865 00866 /** 00867 * Funcao para verificar se fragmentos foram recebidos para o bloco 00868 * passado como parametro. 00869 * 00870 * Obs: Como ainda nao implementamos a classe CNetUdp, que sera a 00871 * responsavel pela copia em tempo real, esta funcao ira retornar false 00872 * se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo 00873 * usado. 00874 * 00875 * @param block bloco para o qual desejamos ver se existem fragmentos. 00876 * @return true se frgamentos ja foram recebidos para o bloco ou false 00877 * se nenhum fragmento foi recebido para o bloco. 00878 */ 00879 bool thereAreFragments( RioBlock block ); 00880 00881 /** 00882 * Retorna o par IP, Porta associado ao objeto NetInterface. No cliente, 00883 * este par e o par IP, porta associado ao servidor de despacho e, no 00884 * servidor, o par IP, porta usado para enviar/receber dados para o/do 00885 * servidor. 00886 * 00887 * Obs: Como nesta nova classe esta funcao e equivalente a funcao 00888 * getmyaddrport com o parametro server igual a 0 (que e o seu valor 00889 * default, sera que nao deveremos substituir todas as chamadas a 00890 * Getmyaddr por getmyaddrport? Esta funcao simplesmente chama a 00891 * fincao getmyaddrport. 00892 */ 00893 void Getmyaddr( int *my_address, int *my_port ); 00894 00895 /** 00896 * Funcao para definir o objeto (do tipo CLogRotation) a ser usado para 00897 * armazenar as estatisticas de envio de pacotes. 00898 * @param LogRotation ponteiro para um objeto do tipo CLogRotation. 00899 */ 00900 void setLogRotation( CLogRotation *LogRotation ); 00901 00902 /** 00903 * Nova chamada para esperar pelo recebimento de um comando vindo do 00904 * outro lado da conexao. 00905 * 00906 * Obs: Esta funcao esta atualmente sendo usada pela parte do codigo do 00907 * RIO que recebe os blocos do arquivo com o resultado de uma das buscas 00908 * nos logs. Sera que nao e melhor criar uma funcao que processe o 00909 * comando na classe NetInterface (e uma funcao tambem na classe NetMgr) 00910 * e fazer com que a busca nos logs chame esta funcao? Isso pode ser 00911 * feito depois de fazermos os testes da nova implementacao do TCP. 00912 * 00913 * @param callback callback a ser chamada quando o objeto NetBuf criado 00914 * for removido. 00915 * @param callbackparm parametro a ser passado a callback. 00916 * @param cmdcallback callback a ser chamada quando recebermos a 00917 * resposta com o tamanho do arquivo de busca e o identificador deste 00918 * arquivo. 00919 * @param IP endereco IP para o qual o bloco deveria ter sido enviado 00920 * (este parametro novo possui um valor default de 0, para 00921 * compatibilidade com as chamadas anteriores). 00922 * @param Port porta para a qual o bloco deveria ter sido enviado (este 00923 * parametro novo possui um valor default de 0, para compatibilidade 00924 * com as chamadas anteriores). 00925 * @return Identificador da estrutura de transferencia usado para 00926 * receber o comando (no caso, o comando enviado pela funcao TellId e o 00927 * usado para receber as informacoes do arquivo com o resultado de uma 00928 * busca nos logs). 00929 */ 00930 TTransferID ExpectCmd( callback_t callback, void *callbackparm, 00931 cmdcallback_t cmdcallback, int IP = 0, 00932 int Port = 0 ); 00933 00934 /** 00935 * Esta funcao e usada para enviar uma mensagem com um codigo de erro 00936 * para cancelar um pedido pendende (note que este erro, ao contrario da 00937 * mensagem enviada por SendResult, indica que um erro ocorreu durante o 00938 * processamento das IDs de transferencia). 00939 * 00940 * Obs: Por enquanto, isso ocorrera quando, ao cliente solicitar uma 00941 * busca nos logs do servidor, pedir ou um bloco que um arquivo com os 00942 * resultados de uma busca cuja identificacao nao existe, ou se pedir um 00943 * bloco invalido deste arquivo. 00944 * 00945 * @param ipadr endereco IP para onde deveremos enviar o codigo de 00946 * erro. 00947 * @param port porta para onde deveremos enviar o codigo de erro. 00948 * @param TransferID identificador da estrutura de transferencia no 00949 * endereco destino associada ao recebimento do resultado a ser enviado. 00950 * @param result codigo de erro a ser enviado. 00951 */ 00952 void SendRst( int ipadr, int port, TTransferID TransferID, 00953 int result ); 00954 00955 /** 00956 * Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP 00957 * ou NetUDP) ao receber dados pela rede. 00958 * @param IP endereco IP da maquina que enviou os dados. 00959 * @param Port porta a partir da qual o pacote foi enviado a partir da 00960 * maquina que enviou estes dados 00961 * @param Data Dados enviados. 00962 * @param DataSize Tamanho dos dados. 00963 * Obs: Um tamanho igual a 0 indicara que a conexao foi fechada pelo 00964 * outro lado. Neste caso, a funcao devera fazer as tarefas necessarias 00965 * para fechar a conexao associada aos dados. 00966 */ 00967 void ProcessData( int IP, int Port, char *Data, unsigned int DataSize ); 00968 00969 /** 00970 * Esta Funcao sera chamada pelo objeto de uma das classes de rede 00971 * (NetTCP ou NetUDP) quando os dados tiverem sido enviados para um 00972 * endereco (com ou sem sucesso). 00973 * @param IP endereco ip da maquina que enviou os dados. 00974 * @param Port porta a partir da qual o pacote foi enviado a partir da 00975 * maquina que enviou estes dados 00976 * @param Param parametro passado quando os dados foram enviados. No 00977 * nosso caso, ele e o identificador da transferencia usada para enviar 00978 * os dados. 00979 */ 00980 void SendDataCompleted( int IP, int Port, void *Param ); 00981 00982 /** 00983 * Esta funcao e chamada quando algum erro ocorrer com a transferencia 00984 * de dados. 00985 * @param IP endereco IP da maquina associada ao socket com o erro. 00986 * @param Port porta associada ao socket com erro 00987 * @param RioError erro que ocorreu na transferencia dos dados. 00988 * @param Msg Mensagem a ser impressa junto com o erro (usada para 00989 * sabermos onde o erro foi gerado) 00990 * @param ErrorType tipo do erro que foi gerado (se foi gerado por um 00991 * recebimento de dados, por um envio de dados, ou por um outro motivo). 00992 * @param Param parametro generico opcional passado a funcao. No nosso 00993 * caso, quando nao NULL, contem o identificador da transferencia 00994 * associada ao erro (isso somente e usado pelo envio dos dados, no 00995 * recebimento, e passado sempre NULLTRANSFERID). 00996 */ 00997 void ProcessError( int IP, int Port, RioResult RioError, 00998 const char *Msg, EErrorType ErrorType, void *Param ); 00999 01000 /** 01001 * Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP 01002 * ou NetUDP) quando a conexao com a par IP, port for fechada. 01003 * 01004 * Os motivos atuais, dados pelo tipo ClosedType, sao: 01005 * 01006 * CONNECTIONCLOSED: a conexao foi fechada pelo outro lado. 01007 * CONNECTIONTIMEOUT: a conexao foi fechada por timeout. 01008 * 01009 * @param IP endereco IP da maquina associada ao socket com o erro. 01010 * @param Port porta associada ao socket com erro 01011 * @param timeout se for true a conexao foi fechada por timeout e, se 01012 * for false, a conexao foi fechada pelo outro lado da conexao. 01013 */ 01014 void ConnectionClosed( int IP, int Port, EClosedType ClosedType ); 01015 01016 /** 01017 * Funcao para verificar se um dado par IP, Porta esta ou nao associado 01018 * a uma conexao do objeto desta classe. 01019 * @param IP IP a ser verificado. 01020 * @param Port Porta a ser verificada. 01021 * @param UseTCP valor booleano que, se false, indica que o bloco 01022 * deve ser enviado em tempo real (via UDP sem retransmissao) e, se for 01023 * true, indica que o bloco deve ser enviado em tempo nao real (usando 01024 * a conexao TCP). Este paramtro e opcional e tem o valor default de 01025 * true (usar a conexao TCP). 01026 * @return true se o par IP, Porta esta associado a uma conexao 01027 * associada a um dos objetos (das classes CNetTcp e CNetUdp) do objeto 01028 * da classe CNetInterface, ou false se o par IP, Porta nao estiver em 01029 * uma destas conexoes ou se algum erro ocorreu (note que, assim como 01030 * as outras funcoes relacionadas a um par IP, porta, nao podemos 01031 * repassar o erro para cima nas classes para manter a conpatibilidade. 01032 * Em caso de erro na checagem, a implementacao antiga entao sera a 01033 * usada). 01034 */ 01035 bool FindIPAndPort( int IP, int Port, bool UseTCP = true ); 01036 01037 friend class CTransferInfo; 01038 }; 01039 #endif // __NETINTERFACE_H_