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 // NetUdp.h: headers for Net.cpp 00022 /////////////////////////////////////////////////////////////////// 00023 00024 #ifndef __NETUDP_H_ 00025 #define __NETUDP_H_ 00026 00027 // Unidades usadas do C. 00028 #include <pthread.h> 00029 #include <sys/types.h> 00030 00031 // Unidades usadas do C++. 00032 #include <fstream> 00033 00034 // Unidades uadas do RIO. 00035 //#include "RioInterface.h" 00036 #include "RioInterfaceTypes.h" 00037 #include "LogRotation.h" 00038 00039 using namespace std; 00040 00041 // Definicoes das classes para evitar erros. 00042 class CNetInterface; 00043 00044 // Estrutura de configuracao do UDP (coloquei somente os campos que serao 00045 // possivelmente usados). 00046 typedef struct 00047 { 00048 bool isServer; // Define se e um cliente ou um dos servidores (usado para 00049 // criar a thread servidora do TCP). 00050 // Campos usados pelo cliente e pelo servidor. 00051 int HostIP; // Endereco IP da maquina associada ao cliente/servidor/storage. 00052 #ifdef RIO_DEBUG_FILE 00053 const char *LogFileName; // Nome do arquivo que armazenara os logs. 00054 #endif 00055 // Campos usados pelo cliente 00056 // Campos usados pelo servidor e pelo storage. 00057 int ServerPort; // Porta TCP do servidor. 00058 CLogRotation *LogRotation; // Ponteiro para um objeto da classe de 00059 // gerenciamento dos logs de envio de dados. 00060 } SNetUdpConfig; 00061 00062 // Classe que usa o UDP para o envio de dados (por enquanto, nao implementada). 00063 class CNetUdp 00064 { 00065 private: 00066 // Define se a classe foi (true) ou nao (false) inicializada. 00067 bool m_Started; 00068 // Ponteiro para o objeto da classe de gerenciamento associada a este 00069 // objeto de envio dos dados. 00070 CNetInterface *m_NetInterface; 00071 // Ponteiro para o objeto da classe de gerenciamento dos logs de envio 00072 // de dados (usado somente pelo servidor). 00073 CLogRotation *m_LogRotation; 00074 // Define se a instancia da classe esta associada a um cliente (false) 00075 // ou a um servidor (true) 00076 bool m_ServerInstance; 00077 00078 public: 00079 #ifdef RIO_DEBUG_FILE 00080 // Log espeficico da classe (separado do RioErr). 00081 ofstream m_log; 00082 #endif 00083 00084 /** 00085 * Construtor da classe, usado para criar um novo objeto da classe. 00086 * @param NetInterface ponteiro para o objeto da classe CNetInterface 00087 * responsavel pelo gerenciamento deste objeto. 00088 */ 00089 CNetUdp( CNetInterface *NetInterface ); 00090 /** 00091 * Destrutor da classe, usado para deletar um objeto criado 00092 * anteriormente. 00093 */ 00094 ~CNetUdp(); 00095 /** 00096 * Funcao para inicializar a classe. Esta funcao deve ser chamada antes 00097 * de a classe poder ser usada. 00098 * @param NetConfig estrutura com as configuracoes do objeto (veja as 00099 * estruturas acima). 00100 * @return S_OK se a classe foi inicializada com sucesso, ou o erro caso 00101 * a inicializacao tenha falhado. 00102 */ 00103 RioResult Start( SNetUdpConfig *NetConfig ); 00104 /** 00105 * Funcao para parar o funcionamento do object (isto e, fechar todas as 00106 * conexoes TCP e terminar todas as threads). 00107 * @return S_OK se o objeto foi finalizado com sucesso, ou o erro caso 00108 * tenho ocorrido algum erro ao finalizar o objeto. 00109 */ 00110 RioResult Stop(); 00111 /** 00112 * Funcao para enviar dados para a maquina identificada nos parametros. 00113 * Obs: Note que os pacotes recebidos serao repassados ao objeto da 00114 * classe CNetInterface, usando a sua funcao ProcessData. 00115 * @param IP endereco IP da maquina destino. 00116 * @param Port porta nesta maquina destino. 00117 * @param Data ponteiro para o endereco inicial da memoria onde estao 00118 * armazenados os dados a serem enviados. 00119 * @param DataSize tamanho em bytes dos dados. 00120 * @param Param parametro a ser passado quando os dados forem enviados 00121 * e a funcao SendDataCompleted do objeto da classe CNetInterface for 00122 * chamado. 00123 * @result S_OK se nenhum erro ocorreu ao enviarmos os dados, ou um 00124 * valor diferente de S_OK caso algum erro tenha ocorrido. 00125 */ 00126 RioResult SendData( int IP, int Port, char *Data, unsigned int DataSize, 00127 void *Param ); 00128 00129 /** 00130 * Funcao para retornar o par IP, Porta associada a uma conexao com o 00131 * servidor definido pelo parametro server. 00132 * @param IP ponteiro para armazenar o endereco IP associado ao servidor 00133 * server. Se IP for NULL, o IP nao sera armazenado. 00134 * @param Port ponteiro para armazenar a porta associado ao servidor 00135 * server. Se Port for NULL, a porta nao sera armazenada. 00136 * @param Server identificador do servidor (em geral, 0=dispatcher e 00137 * 1,2,...=storages). Este parametro nao precisa ser passado e, neste 00138 * caso, o seu valor default sera 0 (usar o dispatcher). se o objeto 00139 * da classe estiver associado ao servidor, este parametro sera 00140 * ignorado. 00141 * @result S_OK se nenhum erro ocorreu obtermos o par IP, Porta, ou um 00142 * valor diferente de S_OK caso algum erro tenha ocorrido. 00143 */ 00144 RioResult GetIPAndPort( int *IP = NULL, int *Port = NULL, 00145 unsigned int Server = 0 ); 00146 00147 /** 00148 * Funcao para retornar um ponteiro para o vetor interno que armazena os 00149 * IPs e as portas. 00150 * @param IPs ponteiro para armazenar o ponteiro para os endercos IPs. 00151 * @param Ports ponteiro para armazenar o ponteiro para as portas. 00152 * @result S_OK se nenhum erro ocorreu obtermos os enderecos, ou um 00153 * valor diferente de S_OK caso algum erro tenha ocorrido. 00154 */ 00155 RioResult GetAllIPsAndPorts( int **IPs, int **Ports ); 00156 00157 /** 00158 * Funcao para verificar se um dado par IP, Porta esta ou nao associado 00159 * a uma conexao do objeto desta classe. 00160 * @param IP IP a ser verificado. 00161 * @param Port Porta a ser verificada. 00162 * @param isFound ponteiro para um valor booleando que sera true se o 00163 * par IP, Porta esta associado a uma conexao, ou false em caso 00164 * contrario. 00165 * @result S_OK se nenhum erro ocorreu buscarmos o par IP, Port, ou um 00166 * valor diferente de S_OK caso algum erro tenha ocorrido. 00167 */ 00168 RioResult FindIPAndPort( int IP, int Port, bool *isFound ); 00169 00170 /** 00171 * Funcao para definir o objeto (do tipo CLogRotation) a ser usado para 00172 * armazenar as estatisticas de envio de pacotes. 00173 * @param LogRotation ponteiro para um objeto do tipo CLogRotation. 00174 */ 00175 void setLogRotation( CLogRotation *LogRotation ); 00176 }; 00177 00178 #endif // __NET_H_