CNetInterface Class Reference

#include <NetInterface.h>

Public Member Functions

 CNetInterface ()
 Construtor da classe CNetInterface, usado para criar um novo objeto da classe.
 ~CNetInterface ()
 Destrutor da classe CNetInterface, usado para deletar um objeto da classe.
RioResult Start (struct sockaddr_in *ServerAddress, unsigned int ServerAddressSize, time_t ConnectionTimeOut=0, unsigned int ReceiveTimeOut=0, unsigned int SendTimeOut=0)
 Funcao usada para inicializar a classe usada pelo cliente.
RioResult Start (int ServerPort, time_t ConnectionTimeOut=0, unsigned int ReceiveTimeOut=0, unsigned int SendTimeOut=0, CLogRotation *LogRotation=NULL)
 Funcao usada para inicializar a classe usada pelo servidor ou o storage.
RioResult Stop ()
 Funcao para parar o funcionamento do objeto da classe, parando todas as threads que tenham sido criadas por um objeto de uma das classes derivadas da CNet e tambem todas as estruturas alocadas.
void getmyaddrport (int *ipaddr, int *port, int server=0)
 Funcao para obter o IP e a porta do servidor passado como parametro.
void getalladdrport (int **ipaddr, int **port)
 Funcao para retornar os pares IP, porta associados ao objeto da classe.
int getipaddr ()
 Funcao para retornar o endereco IP associado ao objeto da classe.
void SendCmd (int ipadr, int port, TTransferID TransferID, char *cmdp, int cmdl, callback_t callback, void *callbackparm)
 Funcao para enviar uma mensagem do tipo comando ao endereco ipadr, port destino, passando o comando dado em cmdp (com o tamanho de cmdl).
void SendResult (int ipadr, int port, TTransferID TransferID, int result)
 Funcao para enviar uma mensagem do tipo resultado ao endereco ipadr, port destino, passando o resultado dado em result.
void SendBlock (int ipadr, int port, TTransferID TransferID, char *bufadr, int buflen, callback_t callback, void *callbackparm, bool UseTCP=true, unsigned int VideoRate=0)
 Funcao para enviar um bloco de um dos arquivos armazenados em um dos storages do RIO, ou para enviar um bloco de um arquivo resultante de uma busca nos logs, para o par ipadr, port do destino.
TTransferID ExpectBlock (char *buf, int len, callback_t callback, void *callbackparm, int sendack=1, int IP=0, int Port=0)
 Funcao para criar uma nova estrutura de transferencia para esperar por um bloco a ser enviado pelo outro lado da conexao.
int CancelExpect (TTransferID TransferID, int result)
 Cancela a espera por dados em uma estrutura de transferencia criada anteriormente (sem chamar a callback).
void TellId (int ipadr, int port, TTransferID TransferID, int tellip, int tellport, TTransferID tellTTransferID, callback_t callback, void *callbackparm)
 Envia ao outro lado da conexao, usando um comando, as informacoes necessarias para que este lado envie um bloco.
void GetBlock (int ipadr, int port, TTransferID TransferID, char *bufadr, int buflen, callback_t callback, void *callbackparm)
 Funcao para esperar por um bloco vindo do outro lado da conexao.
TTransferID ExpectTellId (char *buf, int len, callback_t callback, void *callbackparm, int IP=0, int Port=0)
 Funcao para esperar por IDs enviadas por cada servidor de armazenamento, quando enviamos blocos para o sistema RIO.
int FreeBlock (unsigned int block_id, RioStreamType traffic)
 Funcao para informar que nao desejamos mais esperar por um bloco enviado por tempo real e que a callback passada ao receber o bloco deve ser chamada mesmo que todos os fragmentos nao tenham ainda sido recebidos.
int FreePendentBlocks (bool useCache, int nBuffers)
 Funcao para informar que nao desejamos mais esperar por um conjunto de blocos dado em nBuffers enviados em tempo real e que cada callback passada associada a cada bloco da cache deve ser chamada.
bool thereAreFragments (RioBlock block)
 Funcao para verificar se fragmentos foram recebidos para o bloco passado como parametro.
void Getmyaddr (int *my_address, int *my_port)
 Retorna o par IP, Porta associado ao objeto NetInterface.
void setLogRotation (CLogRotation *LogRotation)
 Funcao para definir o objeto (do tipo CLogRotation) a ser usado para armazenar as estatisticas de envio de pacotes.
TTransferID ExpectCmd (callback_t callback, void *callbackparm, cmdcallback_t cmdcallback, int IP=0, int Port=0)
 Nova chamada para esperar pelo recebimento de um comando vindo do outro lado da conexao.
void SendRst (int ipadr, int port, TTransferID TransferID, int result)
 Esta funcao e usada para enviar uma mensagem com um codigo de erro para cancelar um pedido pendende (note que este erro, ao contrario da mensagem enviada por SendResult, indica que um erro ocorreu durante o processamento das IDs de transferencia).
void ProcessData (int IP, int Port, char *Data, unsigned int DataSize)
 Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) ao receber dados pela rede.
void SendDataCompleted (int IP, int Port, void *Param)
 Esta Funcao sera chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) quando os dados tiverem sido enviados para um endereco (com ou sem sucesso).
void ProcessError (int IP, int Port, RioResult RioError, const char *Msg, EErrorType ErrorType, void *Param)
 Esta funcao e chamada quando algum erro ocorrer com a transferencia de dados.
void ConnectionClosed (int IP, int Port, EClosedType ClosedType)
 Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) quando a conexao com a par IP, port for fechada.
bool FindIPAndPort (int IP, int Port, bool UseTCP=true)
 Funcao para verificar se um dado par IP, Porta esta ou nao associado a uma conexao do objeto desta classe.

Static Public Member Functions

static void dumppkt (const char *label, char *data, int datal)
 Funcao usada para imprimir um buffer (em geral, dados recebidos pela conexao).

Static Public Attributes

static debugCerr m_log

Private Member Functions

RioResult StartNetTcp (SNetTcpConfig *NetConfig)
 Funcao usada para criar e inicializar o objeto derivado da classe classes CNetTcp.
RioResult StartNetUdp (SNetUdpConfig *NetConfig)
 Funcao usada para criar e inicializar o objeto derivado da classe classes CNetUdp.
RioResult StartTransferInfo ()
 Funcao usada para criar um novo objeto da classe CTransferInfo.
RioResult SendData (int IP, int Port, callback_t FinalizeCallback, void *FinalizeCallbackParam, char *Data, unsigned int DataSize, EDataType DataType, bool UseTCP, TTransferID DestTransferID, TTransferID *TransferID=NULL)
 Funcao para criar uma nova estrutura de transferencia e enviar os dados passados como parametro, anexando no inicio dos dados o cabecalho que informa o tipo de dados (passado como parametro) e o identificador da transferencia do outro lado da conexao para a qual os dados serao enviados.
RioResult FindIP (int *IP)
 Funcao para descobrir, dentre todas as interfaces de rede da maquina, a que tiver um IP diferente de 127.0.0.1.

Static Private Member Functions

static void ProcessTransferIDs (void *CmdParam, char *Command, int CommandSize)
 Funcao de callback usada pela funcao ExpectTellId para processar os identificadores recebidos dos servidores de armazenamento e enviar, usando estes identificadores, os blocos para os servidores de armazenamento.
static void FinalizeSendBlocks (void *Param, int Result)
 Funcao de callback chamada quando uma estrutura de transferencia associada ao envio dos blocos aos servidores de armazenamento (criada pela chamada ExpectTellId) receber uma mensagem do tipo RESULTDATA do servidor de despacho informando que todos os servidores de armazenamento reportaram que receberam o bloco (corretamente ou nao).

Private Attributes

bool m_Started
CNetTcpm_NetTcp
CNetUdpm_NetUdp
CTransferInfom_TransferInfo
pthread_mutex_t m_MapMutex

Friends

class CTransferInfo

Detailed Description

Definition at line 357 of file NetInterface.h.


Constructor & Destructor Documentation

CNetInterface::CNetInterface (  ) 

Construtor da classe CNetInterface, usado para criar um novo objeto da classe.

Definition at line 602 of file NetInterface.cpp.

00603 {
00604     #ifdef RIO_DEBUG1
00605     RioErr << "[CNetInterface - Construtor] Start" << endl;
00606     #endif
00607 
00608     // Inicializa as variaveis do objeto da classe.
00609     m_NetTcp = NULL;
00610     m_NetUdp = NULL;
00611     m_Started = false;
00612     m_TransferInfo = NULL;
00613     // m_TransferInfoMap nao precisa ser inicializado.
00614     
00615     // Inicializa o mutex do hash.
00616     pthread_mutex_init( &m_MapMutex, NULL );
00617 
00618     #ifdef RIO_DEBUG1
00619     RioErr << "[CNetInterface - Construtor] Finish" << endl;
00620     #endif
00621 }

CNetInterface::~CNetInterface (  ) 

Destrutor da classe CNetInterface, usado para deletar um objeto da classe.

Definition at line 624 of file NetInterface.cpp.

00625 {
00626     #ifdef RIO_DEBUG1
00627     INTERFACELOG << "[CNetInterface - Destrutor] Start" << endl;
00628     #endif
00629 
00630     // Se a classe estiver inicializada, para a classe.
00631     if( m_Started )
00632         Stop();
00633         
00634     // Destroi o mutex do mapa.
00635     pthread_mutex_destroy( &m_MapMutex );
00636     
00637     #ifdef RIO_DEBUG1
00638     INTERFACELOG << "[CNetInterface - Destrutor] Finish" << endl;
00639     #endif
00640 }


Member Function Documentation

int CNetInterface::CancelExpect ( TTransferID  TransferID,
int  result 
)

Cancela a espera por dados em uma estrutura de transferencia criada anteriormente (sem chamar a callback).

Parameters:
TransferID identificador da transferencia a ser cancelada.
result eu nao tenho certeza deste parametro, mas ele parece que nao foi usado mas passaria, se a callback fosse chamada ao cancelarmos a transferencia, o motivo do cancelamento. A funcao da RioNeti nao usa este parametro.
Returns:
0 se algum erro ocorreu (possivelmente uma ID invalida) ou 1 em caso de sucesso. Como o retorno e ignorado em todos os lugares que

Definition at line 1834 of file NetInterface.cpp.

01835 {
01836     // Armazena o resultado ao executarmos as funcoes do RIO.
01837     RioResult RioStatus;
01838     
01839     // Obs: qual valor a funcao deve retornar? A funcao da RioNeti sempre 
01840     // retorna 1, mas todas as chamadas da funcao ignoram o parametro, entao
01841     // talvez seja melhor a funcao ser do tipo void.
01842 
01843     #ifdef RIO_DEBUG1
01844     INTERFACELOG << "[CNetInterface - CancelExpect] Start" << endl;
01845     #endif
01846 
01847     // Tenta remover a ID TransferID.
01848     RioStatus = m_TransferInfo->RemoveTransfer( TransferID );
01849     if( FAILED( RioStatus ) )
01850     {
01851         #ifdef RIO_DEBUG2                      
01852         INTERFACELOG << "CNetInterface::CancelExpect erro 0x" << hex 
01853                      << RioStatus << dec << " (" 
01854                      << GetErrorDescription( RioStatus ) << ") ao cancelar uma "
01855                      << "estrutura com o ID " << TransferID << " para esperar "
01856                      << "por dados." << endl;
01857         #endif
01858 
01859         #ifdef RIO_DEBUG1
01860         INTERFACELOG << "[CNetInterface - CancelExpect] Finish1" << endl;
01861         #endif
01862         
01863         return 0; 
01864     }
01865 
01866     #ifdef RIO_DEBUG2
01867     INTERFACELOG << "CNetInterface::CancelExpect cancelando a transferencia " 
01868                   << "com a ID " << TransferID << "." << endl;
01869     #endif                      
01870 
01871     #ifdef RIO_DEBUG1
01872     INTERFACELOG << "[CNetInterface - CancelExpect] Finish2" << endl;
01873     #endif
01874     
01875     return 1; 
01876 }

void CNetInterface::ConnectionClosed ( int  IP,
int  Port,
EClosedType  ClosedType 
)

Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) quando a conexao com a par IP, port for fechada.

Os motivos atuais, dados pelo tipo ClosedType, sao:

CONNECTIONCLOSED: a conexao foi fechada pelo outro lado. CONNECTIONTIMEOUT: a conexao foi fechada por timeout.

Parameters:
IP endereco IP da maquina associada ao socket com o erro.
Port porta associada ao socket com erro
timeout se for true a conexao foi fechada por timeout e, se for false, a conexao foi fechada pelo outro lado da conexao.

Definition at line 3497 of file NetInterface.cpp.

03498 {
03499     // Define o erro passado a funcao FinalizeAllTransfers do objeto da classe
03500     // CTransferInfo
03501     RioResult RioError;
03502     // Armazena o resultado da execucao da funcao FinalizeAllTransfers.
03503     RioResult RioStatus;
03504     
03505     #ifdef RIO_DEBUG1
03506     INTERFACELOG << "[CNetInterface - ConnectionClosed] Start" << endl;
03507     #endif
03508     
03509     #ifdef RIO_DEBUG2
03510     // Armazena uma copia do IP para ser usadao pela funcao inet_ntoa.
03511     in_addr ip;
03512     
03513     ip.s_addr = IP;
03514     
03515     INTERFACELOG << "CNetInterface::ConnectionClosed Fechando todas as " 
03516                  << "conexoes ativas para o IP " << inet_ntoa( ip ) << " e a "
03517                  << "porta " << ntohs( Port ) << " devido a: ";
03518     #endif             
03519 
03520     switch( ClosedType )
03521     {
03522         // Neste caso, a conexao foi fechada localmente.
03523         case CONNECTIONCLOSEDLOCALLY:
03524             #ifdef RIO_DEBUG2
03525             INTERFACELOG << "conexao fechada localmente!";
03526             #endif
03527 
03528             RioError = ERROR_NETINTERFACE + ERROR_CLOSED_CONNECTION;
03529             break;
03530 
03531         // Neste caso, a conexao foi fechada pelo outro lado.
03532         case CONNECTIONCLOSEDREMOTELLY:
03533             #ifdef RIO_DEBUG2
03534             INTERFACELOG << "conexao fechada pelo outro lado!";
03535             #endif           
03536               
03537             RioError = ERROR_NETINTERFACE + ERROR_CLOSED_CONNECTION;
03538             break;
03539             
03540         // Neste caso, a conexao foi fechada devido a um timeout.
03541         case CONNECTIONTIMEOUT:
03542             #ifdef RIO_DEBUG2
03543             INTERFACELOG << "conexao fechada por timeout!";
03544             #endif      
03545                    
03546             RioError = ERROR_NETINTERFACE + ERROR_SOCKET_CLOSED;
03547             break;
03548         
03549         // Neste caso, temos um erro de implementacao, pois foi passado um tipo
03550         // nao valido a funcao de callback.
03551         default:
03552             #ifdef RIO_DEBUG2
03553             INTERFACELOG << "nao sei, pois o parametro " << ClosedType 
03554                          << "passado nao foi definido!";
03555             #endif             
03556 
03557             RioError = ERROR_NETINTERFACE + ERROR_INVALID_PARAM;
03558             break;
03559         
03560     }
03561     
03562     #ifdef RIO_DEBUG2
03563     INTERFACELOG << " Fechando todas as conexoes do endereco!" << endl;
03564     
03565     if( this == NULL )
03566         INTERFACELOG << "CNetInterface::ConnectionClosed this NULL!"
03567                      << endl;
03568                  
03569     if( m_TransferInfo == NULL )
03570         INTERFACELOG << "CNetInterface::ConnectionClosed m_TransferInfo NULL!"
03571                      << endl;
03572     #endif     
03573     
03574     // Executa a funcao FinalizeAllTransfers para finalizarmos todas as 
03575     // trasnferencias pendentes.
03576     RioStatus = m_TransferInfo->FinalizeAllTransfers( IP, Port, UNDEFINEDTYPE, 
03577                                                       RioError );
03578     #ifdef RIO_DEBUG2
03579     if( FAILED( RioStatus ) )
03580     {
03581         INTERFACELOG << "CNetInterface::ConnectionClosed erro 0x" << hex 
03582                      << RioStatus << dec << " (" 
03583                      << GetErrorDescription( RioStatus ) << ") ao executar a "
03584                      << "a funcao FinalizeAllTransfers para o par IP " 
03585                      << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) << "." 
03586                      << endl;
03587     }               
03588     #endif     
03589     
03590     #ifdef RIO_DEBUG1
03591     INTERFACELOG << "[CNetInterface - ConnectionClosed] Finish" << endl;
03592     #endif
03593 }

void CNetInterface::dumppkt ( const char *  label,
char *  data,
int  datal 
) [static]

Funcao usada para imprimir um buffer (em geral, dados recebidos pela conexao).

Parameters:
label string a ser impressa antes do conteudo do pacote.
data dados do pacote a serem impressos
datal tamanho em bytes dos dados.

Definition at line 2422 of file NetInterface.cpp.

02423 {
02424     int   off;
02425     int   i;
02426     char *s;
02427     char line[100];
02428 
02429     RioErr << label;
02430 
02431     off = 0;
02432     do
02433     {
02434         s  = line;
02435         s += sprintf(s,"%4.4x ", (unsigned) off);
02436 
02437         for(i = 0; i < 16 && i < datal; i++, data++)
02438         {
02439             s += sprintf(s, "%2.2x", (unsigned)(*data & 0xff));
02440             if((i & 3) == 3)
02441             {
02442                 *s++ = ' ';
02443             }
02444         }
02445 
02446         *s++ = '\n';
02447         *s++ = '\0';
02448 
02449         if(off > 0x20 && off < 0x5a0)
02450             ;
02451         else
02452             RioErr << line;
02453 
02454         datal -= 16;
02455         off   += 16;
02456     } while(datal > 0);
02457     
02458     RioErr << endl;
02459     
02460 }

TTransferID CNetInterface::ExpectBlock ( char *  buf,
int  len,
callback_t  callback,
void *  callbackparm,
int  sendack = 1,
int  IP = 0,
int  Port = 0 
)

Funcao para criar uma nova estrutura de transferencia para esperar por um bloco a ser enviado pelo outro lado da conexao.

Parameters:
buf ponteiro para o lugar onde o bloco, quando recebido, sera armazenado.
len tamanho em blocos do bloco que estamos esperando.
callback callback a ser chamada quando o bloco for recebido.
callbackparm parametro a ser passado a callback
sendack se um ack deve ou nao ser enviado. Como a copia TCP nao possui acks por nao dividir o bloco em fragmentos (como fara a copia em UDP com retransmissao, se implementarmos), este parametro sera ignorado e somente estara aqui porque pode ser futuramente usado).
IP endereco IP para o qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Port porta para a qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Returns:
identificador da estrutura de trasnferencia criada que sera associada ao bloco a ser recebido.

Definition at line 1770 of file NetInterface.cpp.

01773 {
01774     // Armazena o resultado ao executarmos as funcoes do RIO.
01775     RioResult RioStatus;
01776     // Armazena o identificador para a estrutura criada para receber o bloco.
01777     TTransferID TransferID;
01778     
01779     #ifdef RIO_DEBUG2
01780     // Usado para armazenar o IP para impressao.
01781     in_addr ip;
01782 
01783     ip.s_addr = IP;   
01784     #endif
01785 
01786     #ifdef RIO_DEBUG1
01787     INTERFACELOG << "[CNetInterface - ExpectBlock] Start" << endl;
01788     #endif
01789     
01790     RioStatus = m_TransferInfo->NewTransfer( IP, Port, callback, callbackparm,
01791                                              NULL, NULL, buf, len, 
01792                                              RECEIVINGDATA, NULLTRANSFERID,
01793                                              &TransferID );
01794     if( FAILED( RioStatus ) )
01795     {
01796         // O que deveremos fazer neste caso? A RioNeti nao trata de erros de
01797         // alocacao de um NetBuf. Eu estou retornado um identificador invalido
01798         // (com o valor -1).
01799 
01800         // O que devemos fazer neste caso? A RioNeti nao trata de erros de 
01801         // identificador invalido. Como uma callback e chamada, eu acho que
01802         // precisaremos chamar a callback. O erro tambem esta adqeuado (o motivo
01803         // provavelmente sera erro de memoria)?
01804         callback( callbackparm, ERROR_NETINTERFACE + ERROR_MEMORY );
01805 
01806         #ifdef RIO_DEBUG2                      
01807         INTERFACELOG << "CNetInterface::ExpectBlock erro 0x" << hex << RioStatus 
01808                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
01809                      << "ao criar uma estrutura para esperar por um bloco "
01810                      << "associado ao endereco IP " << inet_ntoa( ip ) 
01811                      << " e a porta " << ntohs( Port ) << "." << endl;
01812         #endif 
01813                     
01814         #ifdef RIO_DEBUG1
01815         INTERFACELOG << "[CNetInterface - ExpectBlock] Finish1" << endl;
01816         #endif
01817         
01818         return NULLTRANSFERID;
01819     }
01820 
01821     #ifdef RIO_DEBUG2
01822     INTERFACELOG << "CNetInterface::ExpectBlock esperando bloco associado ao "
01823                  << "endereco IP " << inet_ntoa( ip ) << " e a porta " 
01824                  << ntohs( Port ) << " com a ID " << TransferID << "." << endl;
01825     #endif                      
01826 
01827     #ifdef RIO_DEBUG1
01828     INTERFACELOG << "[CNetInterface - ExpectBlock] Finish2" << endl;
01829     #endif
01830     
01831     return TransferID;
01832 }

TTransferID CNetInterface::ExpectCmd ( callback_t  callback,
void *  callbackparm,
cmdcallback_t  cmdcallback,
int  IP = 0,
int  Port = 0 
)

Nova chamada para esperar pelo recebimento de um comando vindo do outro lado da conexao.

Obs: Esta funcao esta atualmente sendo usada pela parte do codigo do RIO que recebe os blocos do arquivo com o resultado de uma das buscas nos logs. Sera que nao e melhor criar uma funcao que processe o comando na classe NetInterface (e uma funcao tambem na classe NetMgr) e fazer com que a busca nos logs chame esta funcao? Isso pode ser feito depois de fazermos os testes da nova implementacao do TCP.

Parameters:
callback callback a ser chamada quando o objeto NetBuf criado for removido.
callbackparm parametro a ser passado a callback.
cmdcallback callback a ser chamada quando recebermos a resposta com o tamanho do arquivo de busca e o identificador deste arquivo.
IP endereco IP para o qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Port porta para a qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Returns:
Identificador da estrutura de transferencia usado para receber o comando (no caso, o comando enviado pela funcao TellId e o usado para receber as informacoes do arquivo com o resultado de uma busca nos logs).

Definition at line 2589 of file NetInterface.cpp.

02592 {
02593     // Armazena o resultado ao executarmos as funcoes do RIO.
02594     RioResult RioStatus;
02595     // Armazdna o identificador para a estrutura criada para receber o bloco.
02596     TTransferID TransferID;
02597     
02598     #ifdef RIO_DEBUG2
02599     // Usado para armazenar o IP para impressao.
02600     in_addr ip;
02601 
02602     ip.s_addr = IP;   
02603     #endif
02604 
02605     #ifdef RIO_DEBUG1
02606     INTERFACELOG << "[CNetInterface - ExpectCmd] Start" << endl;
02607     #endif
02608     
02609     RioStatus = m_TransferInfo->NewTransfer( IP, Port, callback, callbackparm,
02610                                              cmdcallback, callbackparm, 
02611                                              NULL, NULL, RECEIVINGDATA, 
02612                                              NULLTRANSFERID, &TransferID );
02613     if( FAILED( RioStatus ) )
02614     {
02615         // O que deveremos fazer neste caso? A RioNeti nao trata de erros de
02616         // alocacao de um NetBuf. Eu estou retornado um identificador invalido
02617         // (com o valor -1).
02618 
02619         // O que devemos fazer neste caso? A RioNeti nao trata de erros de 
02620         // identificador invalido. Como uma callback e chamada, eu acho que
02621         // precisaremos chamar a callback. O erro tambem esta adqeuado (o motivo
02622         // provavelmente sera erro de memoria)?
02623         callback( callbackparm, ERROR_NETINTERFACE + ERROR_MEMORY );
02624 
02625         #ifdef RIO_DEBUG2                      
02626         INTERFACELOG << "CNetInterface::ExpectCmd erro 0x" << hex << RioStatus 
02627                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
02628                      << "ao criar uma estrutura para esperar por um comando "
02629                      << "associado ao endereco IP " << inet_ntoa( ip ) 
02630                      << " e a porta " << ntohs( Port ) << "." << endl;
02631         #endif 
02632                     
02633         #ifdef RIO_DEBUG1
02634         INTERFACELOG << "[CNetInterface - ExpectCmd] Finish1" << endl;
02635         #endif
02636         
02637         return NULLTRANSFERID;
02638     }
02639 
02640     #ifdef RIO_DEBUG2
02641     INTERFACELOG << "CNetInterface::ExpectCmd Experando um comando do " 
02642                  << "endereco IP " << inet_ntoa( ip ) << " e da porta " 
02643                  << ntohs( Port ) << " usando a transferencia com a ID " 
02644                  << TransferID << "." << endl;
02645     #endif                      
02646 
02647     #ifdef RIO_DEBUG1
02648     INTERFACELOG << "[CNetInterface - ExpectCmd] Finish2" << endl;
02649     #endif
02650     
02651     return TransferID;
02652 }

TTransferID CNetInterface::ExpectTellId ( char *  buf,
int  len,
callback_t  callback,
void *  callbackparm,
int  IP = 0,
int  Port = 0 
)

Funcao para esperar por IDs enviadas por cada servidor de armazenamento, quando enviamos blocos para o sistema RIO.

Recebemos diversas IDs porque precisamos enviar um bloco para cada replicacao.

Parameters:
buf ponteiro com os dados do bloco a ser enviado.
len tamanho em bytes do bloco.
callback callback a ser chamada quando todos os blocos forem enviados com sucesso.
callbackparm parametro a ser passado quando a callback for chamada
IP endereco IP para o qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Port porta para a qual o bloco deveria ter sido enviado (este parametro novo possui um valor default de 0, para compatibilidade com as chamadas anteriores).
Returns:
identificador da estrutura criada que sera associada ao bloco a ser recebido.

Definition at line 2327 of file NetInterface.cpp.

02330 {
02331     // Ponteiro para a estrutura com as informacoes para processarmos os 
02332     // comandos enviados pelos servidores de armazenamento necessarios para
02333     // obtermos os identificadores de transferencia para o envio dos blocos.
02334     TTellIdData *TellIdData;
02335 
02336     #ifdef RIO_DEBUG2
02337     // Usado para armazenar o IP para impressao.
02338     in_addr ip;
02339 
02340     ip.s_addr = IP;   
02341     #endif
02342 
02343     #ifdef RIO_DEBUG1
02344     INTERFACELOG << "[CNetInterface - ExpectTellId] Finish3" << endl;
02345     #endif
02346     
02347     // Tenta alocar uma estrutura do tipo TTellIdData, com as informacoes a
02348     // serem usadas quando a callback interna da classe for chamada para 
02349     // processar os dados.
02350     try
02351     {
02352         TellIdData = new TTellIdData;
02353     }
02354     catch( bad_alloc& ba )
02355     {
02356         #ifdef RIO_DEBUG2
02357         INTERFACELOG << "CNetInterface::ExpectTellId erro de alocacao de "
02358                      << "memoria (bad_alloc, error = " << ba.what() << ") ao "
02359                      << "criar uma nova estrutura TTellIdData. Retornando " 
02360                      << "um identificador invalido e chamando a callback com " 
02361                      << "o erro ERROR_NETINTERFACE + ERROR_MEMORY." << endl;
02362         #endif
02363         
02364         // Chama a callback para informar o erro (isso esta correto?)
02365         callback( callbackparm, ERROR_NETINTERFACE + ERROR_MEMORY );
02366 
02367         #ifdef RIO_DEBUG1
02368         INTERFACELOG << "[CNetInterface - ExpectTellId] Finish1" << endl;
02369         #endif
02370         
02371         return NULLTRANSFERID;
02372     }
02373     
02374     // Inicializa a estrutura com os valores a serem usados quando cada ID de
02375     // transferencia de um servidor de armazenamento for recebida.
02376     TellIdData->Buffer = buf;
02377     TellIdData->BufferSize = len;
02378     TellIdData->callback = callback;
02379     TellIdData->callbackparm = callbackparm;
02380     TellIdData->NetInterface = this;
02381     TellIdData->SentDataTransfer = ExpectCmd( FinalizeSendBlocks, 
02382                                               ( void * ) TellIdData,
02383                                               ProcessTransferIDs, IP, Port );
02384     if( TellIdData->SentDataTransfer == NULLTRANSFERID )
02385     {
02386         #ifdef RIO_DEBUG2
02387         INTERFACELOG << "CNetInterface::ExpectTellId erro ao executar a funcao "
02388                      << "ExpectCmd. Retornando umum identificador invalido e " 
02389                      << "chamando a callback com o erro "
02390                      << "ERROR_NETINTERFACE + ERROR_MEMORY." << endl;
02391         #endif
02392         
02393         // Remove a estrutura NewData.
02394         delete TellIdData; 
02395         
02396         // Chama a callback para informar o erro (isso esta correto?)
02397         callback( callbackparm, ERROR_NETINTERFACE + ERROR_MEMORY );
02398 
02399         #ifdef RIO_DEBUG1
02400         INTERFACELOG << "[CNetInterface - ExpectTellId] Finish2" << endl;
02401         #endif
02402         
02403         return NULLTRANSFERID;
02404     }
02405 
02406     #ifdef RIO_DEBUG2
02407     INTERFACELOG << "CNetInterface::ExpectTellId esperando por uma ID do "
02408                  << "endereco IP " << inet_ntoa( ip ) << " e da porta " 
02409                  << ntohs( Port ) << ", usando a transfencia com a ID " 
02410                  << TellIdData->SentDataTransfer << "." << endl;
02411     #endif                      
02412 
02413     #ifdef RIO_DEBUG1
02414     INTERFACELOG << "[CNetInterface - ExpectTellId] Finish3" << endl;
02415     #endif
02416     
02417     return  TellIdData->SentDataTransfer;
02418 }

void CNetInterface::FinalizeSendBlocks ( void *  Param,
int  Result 
) [static, private]

Funcao de callback chamada quando uma estrutura de transferencia associada ao envio dos blocos aos servidores de armazenamento (criada pela chamada ExpectTellId) receber uma mensagem do tipo RESULTDATA do servidor de despacho informando que todos os servidores de armazenamento reportaram que receberam o bloco (corretamente ou nao).

Obs: A callback passada originalmente a funcao ExpectTellId sera chamada se isResultReceived for true (indicando que a chamada FinalizeSendBlocks foi executada) e se SentBlockCount for 0 (indicando que recebemos a confirmacao de envio do bloco para cada servidor de armazenamento que enviou uma ID de transferencia). Esta verificacao e feita aqui e na funcao SendBlockCompleted para evitarmos dependencia da ordem do recebimento da mensagem RESULTDATA e das confirmacoes do recebimento dos blocos).

Parameters:
Param parametro passado quando a funcao ExpectTellId foi chamada (mais uma vez um ponteiro para uma estrutura do tipo TTellIdData).
Result resultado do recebimento do dado com um resultado (S_OK ou o codigo do erro caso tenha ocorrido algum erro receber o dado com o resultado).

Definition at line 2183 of file NetInterface.cpp.

02184 {
02185     // Ponteiro para a estrutura com as informacoes para processarmos os 
02186     // comandos enviados pelos servidores de armazenamento necessarios para
02187     // obtermos os identificadores de transferencia para o envio dos blocos.
02188     TTellIdData *TellIdData;
02189 
02190     // Obtem o ponteiro para a estrutura NewData.
02191     TellIdData = ( TTellIdData * ) Param;
02192 
02193     #ifdef RIO_DEBUG1
02194     STATICINTERFACELOG << "[CNetInterface - FinalizeSendBlocks] Start" << endl;
02195     #endif
02196     
02197     #ifdef RIO_DEBUG2
02198     // Imprime o erro passado na mensagem RESULTDATA
02199     STATICINTERFACELOG << "CNetInterface::FinalizeSendBlocks callback chamada "
02200                        << "com o erro 0x" << hex << Result << dec << " ( "
02201                        << GetErrorDescription( Result ) << "), associada a " 
02202                        << "transferencia com a ID " 
02203                        << TellIdData->SentDataTransfer << "." << endl;
02204     #endif
02205     
02206     // Chama a callback para informar que os blocos foram (ou nao) enviados com
02207     // sucesso aos storages.
02208     #ifdef RIO_DEBUG2
02209     STATICINTERFACELOG << "CNetInterface::FinalizeSendBlocks como o servidor "
02210                        << "enviou a mensagem RESULTDATA, entao todos os blocos "
02211                        << "foram enviados (pois o servidor somente envia a "
02212                        << "mensagem depois de todos os storages confirmarem "
02213                        << "o envio dos blocos, mesmo que algum erro ocorra!"
02214                        << "Chamando a callback passada a funcao ExpectTellID "
02215                        << "com o resultado 0x" << hex << Result << dec
02216                        << " (" << GetErrorDescription( Result ) << ")." << endl;
02217     #endif
02218     
02219     TellIdData->callback( TellIdData->callbackparm, Result );
02220     
02221     #ifdef RIO_DEBUG1
02222     STATICINTERFACELOG << "[CNetInterface - FinalizeSendBlocks] Finish" << endl;
02223     #endif
02224 }

RioResult CNetInterface::FindIP ( int *  IP  )  [private]

Funcao para descobrir, dentre todas as interfaces de rede da maquina, a que tiver um IP diferente de 127.0.0.1.

Se nao existir uma interface com um IP diferente deste, entao este IP sera retornado. Obs: O codigo desta funcao foi copiado da RioNeti. Depois podemos ver se existe um modo melhor de fazer a mesma tarefa.

Parameters:
IP ponteiro para o endereco no qual o IP sera armazenado.
Returns:
S_OK se nenhum erro ocorreu ao descobrir a interface, ou o codigo de erro indicando o erro que ocorreu.

Definition at line 2229 of file NetInterface.cpp.

02230 {
02231     #ifdef RIO_DEBUG1
02232     RioErr << "[CNetInterface - FindIP] Start" << endl;
02233     #endif
02234 
02235     struct if_nameindex *iflist   = NULL;
02236     struct if_nameindex *listsave = NULL;
02237     struct ifreq         ifreq;
02238     int                  auxsock  = 0;
02239     struct sockaddr_in   sa;
02240     char                 localhost_ip[IP_STRING_SIZE] = "";
02241 
02242     if( ( auxsock = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
02243     {
02244         *IP = 0;
02245 
02246         #ifdef RIO_DEBUG2
02247         RioErr << "CNetInterface::FindIP erro " << errno << " (" 
02248                << strerror( errno )  << ") ao criar o socket  temporario que "
02249                << "sera usado para obtermos os possiveis enderecos IP da "
02250                << "maquina" << endl;
02251         #endif
02252 
02253         #ifdef RIO_DEBUG1
02254         RioErr << "[CNetInterface - FindIP] Finish1" << endl;
02255         #endif
02256 
02257         return ERROR_NETINTERFACE + ERROR_SOCKET_CREATE;
02258     }
02259 
02260     // returns pointer to dynamically allocated list of structs
02261     listsave = if_nameindex();
02262     iflist   = listsave;
02263 
02264     for( ; *(char *)iflist != 0; iflist++ )
02265     {
02266         // copy in the interface name to look up address of
02267         strncpy( ifreq.ifr_name, iflist->if_name, IF_NAMESIZE );
02268 
02269         // get the address for this interface
02270         if( ioctl( auxsock, SIOCGIFADDR, &ifreq ) < 0 )
02271         {
02272             // blank IP address
02273             if( errno != 99 )
02274             {
02275                *IP = 0;
02276 
02277                 #ifdef RIO_DEBUG2
02278                 RioErr << "CNetInterface::FindIP erro " << errno  << " (" 
02279                        << strerror( errno ) << ") ao executar a funcao ioctl "
02280                        << "sobre o socket ao obtermos os possiveis enderecos "
02281                        << "IP da maquina." << endl;
02282                 #endif
02283 
02284                 #ifdef RIO_DEBUG1
02285                 RioErr << "[CNetInterface - FindIP] Finish2" << endl;
02286                 #endif
02287 
02288                 return ERROR_NETINTERFACE + ERROR_IOCTL_FAILED;
02289             }
02290         }
02291 
02292         // Take a valid address
02293         memset( &sa, 0, sizeof( struct sockaddr_in ) );
02294         memcpy( &sa, &ifreq.ifr_addr, sizeof( struct sockaddr_in ) );
02295         strcpy( localhost_ip, inet_ntoa( sa.sin_addr ) );
02296 
02297         #ifdef RIO_DEBUG2
02298         RioErr << "CNetInterface::FindIP endereco IP associado a placa: " 
02299                << localhost_ip << endl;
02300         #endif             
02301         
02302         if( strcmp( "127.0.0.1", localhost_ip ) != 0 )
02303             break; // Take the first IP different from 127.0.0.1
02304     }
02305 
02306     if_freenameindex( listsave );
02307     close( auxsock );
02308 
02309     *IP = sa.sin_addr.s_addr;
02310     
02311     #ifdef RIO_DEBUG2
02312     RioErr << "CNetInterface::FindIP ip achado com sucesso. O IP escolhido "
02313            << "foi o " << inet_ntoa( sa.sin_addr ) << "." << endl;
02314     #endif
02315 
02316     #ifdef RIO_DEBUG1
02317     RioErr << "[CNetInterface - FindIP] Finish3" << endl;
02318     #endif
02319 
02320     return S_OK;
02321 }

bool CNetInterface::FindIPAndPort ( int  IP,
int  Port,
bool  UseTCP = true 
)

Funcao para verificar se um dado par IP, Porta esta ou nao associado a uma conexao do objeto desta classe.

Parameters:
IP IP a ser verificado.
Port Porta a ser verificada.
UseTCP valor booleano que, se false, indica que o bloco deve ser enviado em tempo real (via UDP sem retransmissao) e, se for true, indica que o bloco deve ser enviado em tempo nao real (usando a conexao TCP). Este paramtro e opcional e tem o valor default de true (usar a conexao TCP).
Returns:
true se o par IP, Porta esta associado a uma conexao associada a um dos objetos (das classes CNetTcp e CNetUdp) do objeto da classe CNetInterface, ou false se o par IP, Porta nao estiver em uma destas conexoes ou se algum erro ocorreu (note que, assim como as outras funcoes relacionadas a um par IP, porta, nao podemos repassar o erro para cima nas classes para manter a conpatibilidade. Em caso de erro na checagem, a implementacao antiga entao sera a usada).

Definition at line 3597 of file NetInterface.cpp.

03598 {
03599     // Armazena o resultado da chamada da funcao FindIPAndPort do objeto da 
03600     // classe CNetTcp ou do objeto da classe CNetUdp (isso dependera do tipo
03601     // de trafego dado por StreamTraffic).
03602     bool isIpAndPortFound;
03603     // Armazena o resultado da execucao da funcao FindIPAndPort.
03604     RioResult RioStatus;
03605 
03606     #ifdef RIO_DEBUG1
03607     INTERFACELOG << "[CNetInterface - FindIPAndPort] Start" << endl;
03608     #endif
03609     
03610     #ifdef RIO_DEBUG2
03611     // Armazena uma copia do IP para ser usadao pela funcao inet_ntoa.
03612     in_addr ip;
03613     
03614     ip.s_addr = IP;
03615     #endif     
03616     
03617     #ifdef RIO_DEBUG2
03618     INTERFACELOG << "CNetInterface::FindIPAndPort procurando pelo IP " 
03619                  << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) 
03620                  << "." << endl;
03621     #endif        
03622 
03623     // Verificamos o tipo de trafego porque a busca devera ser feita no objeto
03624     // da classe CNetTcp se o trafego for em tempo nao real, e no objeto da 
03625     // classe CNetUdp em caso contrario.
03626     if( UseTcp )
03627     {
03628         // No caso do trafego em tempo nao real, usamos a funcao da classe TCP.
03629         RioStatus = m_NetTcp->FindIPAndPort( IP, Port, &isIpAndPortFound );
03630     }
03631     else
03632     {
03633         // No caso do trafego em tempo nao real, usamos a funcao da classe UDP.
03634         //
03635         // Obs: como a classe ainda nao esta implementada, a chamada da funcao
03636         // esta comentada e uma atribuicao padrao de erro de implementacao esta
03637         // no seu lugar. Quando a classe for implementada, a linha a seguir
03638         // deve ser descomentada e a linha seguinte a ela deve ser removida
03639         // (isso foi feito porque m_NetUdp e um ponteiro NULL).
03640         // RioStatus = m_NetUdp->FindIPAndPort( IP, Port, &isIpAndPortFound );
03641         RioStatus = ERROR_NETUDP + ERROR_NOT_IMPLEMENTED; 
03642     }
03643 
03644     if( FAILED( RioStatus ) )
03645     {
03646         #ifdef RIO_DEBUG2
03647         INTERFACELOG << "CNetInterface::FindIPAndPort erro 0x" << hex 
03648                      << RioStatus << dec << " (" 
03649                      << GetErrorDescription( RioStatus ) << ") ao executar a "
03650                      << "a funcao FindIPAndPort para o par IP " 
03651                      << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) << "." 
03652                      << endl;
03653         #endif
03654         
03655         isIpAndPortFound = false;     
03656     }               
03657 
03658     #ifdef RIO_DEBUG2
03659     INTERFACELOG << "CNetInterface::FindIPAndPort o IP " << inet_ntoa( ip ) 
03660                   << " e a porta " << ntohs( Port ) 
03661                   << ( ( isIpAndPortFound ) ? " foram" : " nao foram" )
03662                   << " achados!" << endl;
03663     #endif        
03664 
03665     #ifdef RIO_DEBUG1
03666     INTERFACELOG << "[CNetInterface - FindIPAndPort] Finish" << endl;
03667     #endif
03668     
03669     return isIpAndPortFound;
03670 }

int CNetInterface::FreeBlock ( unsigned int  block_id,
RioStreamType  traffic 
)

Funcao para informar que nao desejamos mais esperar por um bloco enviado por tempo real e que a callback passada ao receber o bloco deve ser chamada mesmo que todos os fragmentos nao tenham ainda sido recebidos.

Obs: Como ainda nao implementamos a classe CNetUdp, que sera a responsavel pela copia em tempo real, esta funcao ira retornar 0 se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo usado.

Parameters:
block_id identificador do bloco (provavelmente o identificador da estrutura de transferencia associada ao recebimento deste bloco).
traffic tipo de trafego (UNICASTTRAFFIC ou MULTICASTTRAFFIC).
Returns:
numero de bytes recebidos do bloco.

Definition at line 2465 of file NetInterface.cpp.

02466 {
02467     #ifdef RIO_DEBUG1
02468     INTERFACELOG << "[CNetInterface - FreeBlock] Start" << endl;
02469     #endif
02470     
02471     #ifdef RIO_DEBUG2
02472     INTERFACELOG << "[CNetInterface::FreeBlock] Esta funcao nao esta "
02473                  << "implementada! Retornado o valor 0!" << endl;
02474     #endif
02475     
02476     #ifdef RIO_DEBUG1
02477     INTERFACELOG << "[CNetInterface - FreeBlock] Finish" << endl;
02478     #endif
02479     
02480     return 0;
02481 }

int CNetInterface::FreePendentBlocks ( bool  useCache,
int  nBuffers 
)

Funcao para informar que nao desejamos mais esperar por um conjunto de blocos dado em nBuffers enviados em tempo real e que cada callback passada associada a cada bloco da cache deve ser chamada.

Obs: Como ainda nao implementamos a classe CNetUdp, que sera a responsavel pela copia em tempo real, esta funcao ira retornar 0 se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo usado.

Parameters:
useCache valor booleando indicando se estamos usando ou nao uma cache de blocos.
nBuffers buffer com as informacoes dos blocos para os quais nao desejamos mais esperar.
Returns:
soma dos tamanhos dos bytes recebidos em cada bloco.

Definition at line 2486 of file NetInterface.cpp.

02487 {
02488     #ifdef RIO_DEBUG1
02489     INTERFACELOG << "[CNetInterface - FreePendentBlocks] Start" << endl;
02490     #endif
02491     
02492     #ifdef RIO_DEBUG2
02493     INTERFACELOG << "[CNetInterface::FreePendentBlocks] Esta funcao nao esta "
02494                  << "implementada! Retornado o valor 0!" << endl;
02495     #endif
02496     
02497     #ifdef RIO_DEBUG1
02498     INTERFACELOG << "[CNetInterface - FreePendentBlocks] Finish" << endl;
02499     #endif
02500     
02501     return 0;
02502 }

void CNetInterface::getalladdrport ( int **  ipaddr,
int **  port 
)

Funcao para retornar os pares IP, porta associados ao objeto da classe.

Se o objeto estiver associado a um cliente, entao todos os pares IP, porta do cliente nos servidores serao retornados. Caso o objeto esteja associado ao servidor, sera retornado um ponteiro para um inteiro com o IP do servidor e um outro ponteiro para um inteiro com a porta na qual os clientes devem se conectar ao servidor.

Parameters:
ipaddr ponteiro para armazenar os enderecos IPs.
port ponteiro para armazenar as portas.

Definition at line 1473 of file NetInterface.cpp.

01474 {
01475     // Armazena o resultado da funcao GetAllIPsAndPorts do objeto da classe 
01476     // CNet.
01477     RioResult RioStatus;
01478 
01479     #ifdef RIO_DEBUG1
01480     INTERFACELOG << "[CNetInterface - getalladdrport] Start" << endl;
01481     #endif
01482 
01483     if( !m_Started )
01484     {
01485         #ifdef RIO_DEBUG2
01486         INTERFACELOG << "CNetInterface::getalladdrport o objeto nao foi "
01487                      << "inicializado." << endl;
01488         #endif
01489         
01490         *ipaddr = NULL;
01491         *port = NULL;
01492 
01493         #ifdef RIO_DEBUG1
01494         INTERFACELOG << "[CNetInterface - getalladdrport] Finish1" << endl;
01495         #endif
01496         
01497         return;
01498     }
01499     
01500     // Obs: Mudar de m_NetTcp para m_NetUdp quando a classe for implementada.
01501     RioStatus = m_NetTcp->GetAllIPsAndPorts( ipaddr, port );
01502     #ifdef RIO_DEBUG2
01503     if( FAILED( RioStatus ) )
01504     {
01505         INTERFACELOG << "CNetInterface::getalladdrport aviso: erro 0x" 
01506                      << RioStatus << " (" << GetErrorDescription( RioStatus )
01507                      << ") ao executar a funcao GetAllIPsAndPorts do objeto da "
01508                      << "classe CNet. Erro ignorado porque esta funcao nao "
01509                      << "retorna um valor!" << endl;
01510     }
01511 
01512     INTERFACELOG << "CNetInterface::getalladdrport retornando todos os pares "
01513                  << "IP, porta associados ao objeto da classe." << endl;
01514     #endif
01515 
01516     #ifdef RIO_DEBUG1
01517     INTERFACELOG << "[CNetInterface - getalladdrport] Finish2" << endl;
01518     #endif
01519 }

void CNetInterface::GetBlock ( int  ipadr,
int  port,
TTransferID  TransferID,
char *  bufadr,
int  buflen,
callback_t  callback,
void *  callbackparm 
)

Funcao para esperar por um bloco vindo do outro lado da conexao.

Parameters:
ipadr endereco IP para onde a ID deve ser enviada.
port porta neste endereco para onde a ID deve ser enviada.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do comando com a ID que devera ser processado.
bufadr ponteiro para o endereco que armazenara o bloco recebido do outro lado.
buflen tamanho esperado para o bloco.
callback callback a ser chamada quando o bloco for recebido.
callbackparm parametro a ser passado quando a callback for chamada.

Definition at line 1929 of file NetInterface.cpp.

01932 {
01933     // Armazena o identificador para a estrutura criada para esperar pelo 
01934     // termino do comando que envia as informacoes ao outro lado.
01935     TTransferID AuxTransferID;
01936     // Armazena o par IP, porta associado ao storage.
01937     int ipstor, portstor;
01938     // Armazena o resultado da chamada a uma funcao do RIO.
01939     RioResult RioStatus;
01940 
01941     #ifdef RIO_DEBUG2
01942     // Usado para armazenar o IP para impressao.
01943     in_addr ip;
01944     #endif
01945 
01946     #ifdef RIO_DEBUG1
01947     INTERFACELOG << "[CNetInterface - GetBlock] Start" << endl;
01948     #endif
01949     
01950     // Obtem o par IP, porta do storage.
01951     RioStatus = m_NetTcp->GetIPAndPort( &ipstor, &portstor );
01952     if( FAILED( RioStatus ) )
01953     {
01954         // Ocorreu um erro ao obter o par IP, porta do storage.
01955         // 
01956         // Obs: Devemos, assim como na NetMgr, copiar estes pares IP, porta em
01957         // algum campo do objeto?
01958         //
01959         
01960         #ifdef RIO_DEBUG2                      
01961         INTERFACELOG << "CNetInterface::GetBlock erro 0x" << hex << RioStatus
01962                      << dec << " (" << GetErrorDescription( RioStatus ) 
01963                      << ") ao obter o par IP, porta do storage." << endl;
01964         #endif
01965 
01966         #ifdef RIO_DEBUG1
01967         INTERFACELOG << "[CNetInterface - GetBlock] Finish1" << endl;
01968         #endif
01969         
01970         return;
01971         
01972     }
01973 
01974     // Executa a funcao ExpectBlock para informar, ao outro lado, que estamos
01975     // esperando pelo recebimento de um bloco.
01976     AuxTransferID = ExpectBlock( bufadr, buflen, callback, callbackparm, 0,
01977                                  ipadr, port );
01978     if( AuxTransferID == NULLTRANSFERID )
01979     {
01980         // Um erro ocorreu ao criar uma nova estrutura para receber os dados.
01981         // A callback ja foi chamada na funcao ExpectBlock para informar o erro.
01982         
01983         #ifdef RIO_DEBUG2                      
01984         INTERFACELOG << "CNetInterface::GetBlock erro ao criar uma nova "
01985                      << "estrutura de transferencia para esperar por um bloco. "
01986                      << endl;
01987         #endif
01988 
01989         #ifdef RIO_DEBUG1
01990         INTERFACELOG << "[CNetInterface - GetBlock] Finish2" << endl;
01991         #endif
01992         
01993         return;
01994     }
01995 
01996     #ifdef RIO_DEBUG2
01997     ip.s_addr = ipadr;
01998     INTERFACELOG << "CNetInterface::GetBlock esperando por um bloco do IP " 
01999                  <<  inet_ntoa( ip ) << " e a porta " << ntohs( port ) 
02000                  << " usando a estrutura de transferencia com a ID "
02001                  << AuxTransferID << ". Identificacao da transferencia " 
02002                  << "passada como parametro " << TransferID << "." << endl;
02003 
02004     INTERFACELOG << "CNetInterface::GetBlock Antes de executar TellId, usando "
02005                  << "os parametros " << inet_ntoa( ip ) << ", " << ntohs( port )
02006                  << ", " << TransferID;
02007     fflush( stderr );
02008     ip.s_addr = ipstor;
02009     INTERFACELOG << inet_ntoa( ip ) << ", " << ntohs( portstor ) << ", "
02010                  << AuxTransferID << "NULL, NULL." << endl;
02011     #endif                  
02012     
02013     // Agora vamos informar a ID da transferencia ao outro lado.    
02014     TellId( ipadr, port, TransferID, ipstor, portstor, AuxTransferID, NULL,
02015             NULL );
02016 
02017     #ifdef RIO_DEBUG2
02018     INTERFACELOG << "CNetInterface::GetBlock Depois de executar TellId" << endl;
02019     #endif
02020 
02021     #ifdef RIO_DEBUG1
02022     INTERFACELOG << "[CNetInterface - GetBlock] Finish2" << endl;
02023     #endif
02024 }

int CNetInterface::getipaddr (  ) 

Funcao para retornar o endereco IP associado ao objeto da classe.

No caso do cliente, sera retornado o IP associado ao servidor de despacho e, no caso do servidor, o IP associado ao servidor.

Returns:
endereco IP associado ao objeto da classe.

Definition at line 1524 of file NetInterface.cpp.

01525 {
01526     // Armazena o resultado ao executarmos as funcoes do RIO.
01527     RioResult RioStatus;
01528     // Usado para armazenar o IP obtido pela funcao GetIPAndPort.
01529     int IP;
01530 
01531     #ifdef RIO_DEBUG2
01532     // Armazena uma copia do endereco IP para ser impressa.
01533     in_addr ip;    
01534     #endif
01535 
01536     #ifdef RIO_DEBUG1
01537     INTERFACELOG << "[CNetInterface - getipaddr] Start" << endl;
01538     #endif
01539 
01540     if( !m_Started )
01541     {
01542         #ifdef RIO_DEBUG2
01543         INTERFACELOG << "CNetInterface::getipaddr o objeto nao foi "
01544                      << "inicializado." << endl;
01545         #endif
01546         
01547         #ifdef RIO_DEBUG1
01548         INTERFACELOG << "[CNetInterface - getipaddr] Finish1" << endl;
01549         #endif
01550         
01551         return 0;
01552     }
01553     
01554     // Obs: Mudar de m_NetTcp para m_NetUdp quando a classe for implementada.
01555     RioStatus = m_NetTcp->GetIPAndPort( &IP, NULL );
01556     #ifdef RIO_DEBUG2
01557     if( FAILED( RioStatus ) )
01558     {
01559         INTERFACELOG << "CNetInterface::getipaddr aviso: erro 0x" 
01560                      << RioStatus << " (" << GetErrorDescription( RioStatus )
01561                      << ") ao executar a funcao GetIPAndPort do objeto da "
01562                      << "classe CNet. Erro ignorado porque esta funcao nao "
01563                      << "retorna um valor!" << endl;
01564     }
01565 
01566     ip.s_addr = IP;
01567     INTERFACELOG << "CNetInterface::getipaddr retornando o IP " 
01568                  << inet_ntoa( ip ) << " associado ao servidor de despacho."
01569                  << endl;
01570     #endif
01571 
01572     #ifdef RIO_DEBUG1
01573     INTERFACELOG << "[CNetInterface - getipaddr] Finish2" << endl;
01574     #endif
01575     
01576     return IP;
01577 }

void CNetInterface::Getmyaddr ( int *  my_address,
int *  my_port 
)

Retorna o par IP, Porta associado ao objeto NetInterface.

No cliente, este par e o par IP, porta associado ao servidor de despacho e, no servidor, o par IP, porta usado para enviar/receber dados para o/do servidor.

Obs: Como nesta nova classe esta funcao e equivalente a funcao getmyaddrport com o parametro server igual a 0 (que e o seu valor default, sera que nao deveremos substituir todas as chamadas a Getmyaddr por getmyaddrport? Esta funcao simplesmente chama a fincao getmyaddrport.

Definition at line 2525 of file NetInterface.cpp.

02526 {
02527     #ifdef RIO_DEBUG2
02528     // Usado para armazenar o IP para impressao.
02529     in_addr ip;
02530     #endif
02531 
02532     #ifdef RIO_DEBUG1
02533     INTERFACELOG << "[CNetInterface - Getmyaddr] Start" << endl;
02534     #endif
02535 
02536     getmyaddrport( my_address, my_port, 0 );
02537     
02538     #ifdef RIO_DEBUG2
02539     ip.s_addr = *my_address;
02540     INTERFACELOG << "CNetInterface::Getmyaddr obtido o IP " << inet_ntoa( ip ) 
02541                  << "e a porta " << ntohs( *my_port ) << " associada ao "
02542                  << "servidor de despacho." << endl;
02543     #endif
02544 
02545     #ifdef RIO_DEBUG1
02546     INTERFACELOG << "[CNetInterface - Getmyaddr] Finish" << endl;
02547     #endif
02548 }

void CNetInterface::getmyaddrport ( int *  ipaddr,
int *  port,
int  server = 0 
)

Funcao para obter o IP e a porta do servidor passado como parametro.

Por default, sera obtido o par IP, porta do servidor com o identificador 0 (no caso do cliente, o par IP, porta do cliente no servidor de despacho).

Parameters:
ipaddr ponteiro para armazenar o endereco IP.
port ponteiro para armazenar a porta.
server identificador do servidor para o qual desejamos obter o par IP, porta. Para o servidor, qualquer valor diferente de 0 nao retornara valores. Para o cliente, o valor 0 se refere ao servidor de despacho e os valores de 1 ate o numero de servidores de armazenamento a cada um dos servidores de armazenamento (na mesma ordem em que eles estao no arquivo de configuracao do servidor de despacho, mas o cliente nao precisa saber disso).

Definition at line 1412 of file NetInterface.cpp.

01413 {
01414     // Armazena o resultado ao executarmos as funcoes do RIO.
01415     RioResult RioStatus;
01416     
01417     #ifdef RIO_DEBUG2
01418     // Armazena uma copia do endereco IP para ser impressa.
01419     in_addr ip;    
01420     #endif
01421 
01422     #ifdef RIO_DEBUG1
01423     INTERFACELOG << "[CNetInterface - getmyaddrport] Start" << endl;
01424     #endif
01425 
01426     if( !m_Started )
01427     {
01428         #ifdef RIO_DEBUG2
01429         INTERFACELOG << "CNetInterface::getmyaddrport o objeto nao foi "
01430                      << "inicializado." << endl;
01431         #endif
01432         
01433         *ipaddr = 0;
01434         *port = 0;
01435 
01436         #ifdef RIO_DEBUG1
01437         INTERFACELOG << "[CNetInterface - getmyaddrport] Finish1" << endl;
01438         #endif
01439         
01440         return;
01441     }
01442     
01443     // Obs: Mudar de m_NetTcp para m_NetUdp quando a classe for implementada.
01444     RioStatus = m_NetTcp->GetIPAndPort( ipaddr, port, server );
01445     #ifdef RIO_DEBUG2
01446     if( FAILED( RioStatus ) )
01447     {
01448         INTERFACELOG << "CNetInterface::getmyaddrport aviso: erro 0x" 
01449                      << RioStatus << " (" << GetErrorDescription( RioStatus )
01450                      << ") ao executar a funcao GetIPAndPort do objeto da "
01451                      << "classe CNet. Erro ignorado porque esta funcao nao "
01452                      << "retorna um valor!" << endl;
01453     }
01454     
01455     ip.s_addr = *ipaddr;
01456     INTERFACELOG << "CNetInterface::getmyaddrport retornando o IP " 
01457                  << inet_ntoa( ip ) << " e porta " << ntohs( *port ) 
01458                  << " associado ao servidor com a ID " << server << "." 
01459                  << endl;
01460     #endif
01461 
01462     #ifdef RIO_DEBUG1
01463     INTERFACELOG << "[CNetInterface - getmyaddrport] Finish2" << endl;
01464     #endif
01465 }

void CNetInterface::ProcessData ( int  IP,
int  Port,
char *  Data,
unsigned int  DataSize 
)

Esta funcao e chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) ao receber dados pela rede.

Parameters:
IP endereco IP da maquina que enviou os dados.
Port porta a partir da qual o pacote foi enviado a partir da maquina que enviou estes dados
Data Dados enviados.
DataSize Tamanho dos dados. Obs: Um tamanho igual a 0 indicara que a conexao foi fechada pelo outro lado. Neste caso, a funcao devera fazer as tarefas necessarias para fechar a conexao associada aos dados.

Definition at line 2705 of file NetInterface.cpp.

02707 {
02708     // Armazena o resultado da execucao das funcoes do RIO.
02709     RioResult RioStatus;
02710     // Armazena o IP guardado na estrutura da transferencia com o ID TransferID.
02711     int IPTransfer;
02712     // Armazena a porta guardada na estrutura da transferencia com o ID 
02713     // TransferID.
02714     int PortTransfer;
02715     // Armazena a callback de finalizacao associada a transferencia.
02716     callback_t FinalizeCallback;
02717     // Armazena o parametro que deve ser passado quando a callback 
02718     // FinalizeCallback for chamada.
02719     void *FinalizeCallbackParam;
02720     // Armazena a callback de processamento de dados recebidos (somente usada 
02721     // quando mensagens com comandos, do tipo CMDDATA, sao enviadas para o 
02722     // outro lado).
02723     cmdcallback_t ProcessCallback;
02724     // Armazena o parametro que deve ser passado quando a callback 
02725     // ProcessCallbackParam for chamada.
02726     void *ProcessCallbackParam;
02727     // Armazena o ponteiro para os dados que foram enviados (e aqui que vamos
02728     // remover este buffer, apos chamarmos a callback FinalizeCallback).
02729     char *DataTransfer;
02730     // Armazena o tamanho em bytes dos dados apontados por Data.
02731     unsigned int DataTransferSize;
02732     // Armazena o tipo da transferencia (se e para envio de dados, o correto 
02733     // para esta chamada ou recebimento de dados, que seria incorreto para 
02734     // esta chamada).
02735     ETransferType TransferType;
02736     // Armazena uma copia do IP para ser usadao pela funcao inet_ntoa do 
02737     // parametro IP e uma copia, tambem para ser usada pela funcao  inet_ntoa,
02738     // do parametro IPTransfer.
02739     in_addr ip, ipt;
02740     // Estrutura que armazenara o cabecalho recebido pela conexao de rede.
02741     SDataHeader DataHeader;
02742     // Define se a estrutura associada a transferencia deve ou nao ser removida
02743     // (isso nao ocorrera para as mensagens do tipo CMDDATA).
02744     bool RemoveTrasnfer;
02745     // Armazena os resultados ou erros recebidos pelas mensagens RSTDATA e 
02746     // RESULTDATA, que devem ser passados a callback de finalizacao.
02747     int Result;
02748 
02749     #ifdef RIO_DEBUG1
02750     INTERFACELOG << "[CNetInterface - ProcessData] Start" << endl;
02751     #endif
02752 
02753     // Inicializa ip com a copia do IP.    
02754     ip.s_addr = IP;
02755 
02756     // Primeiramente verificamos se os dados possuem bytes suficientes para o 
02757     // cabecalho mais um dado.
02758     if( DataSize < ( DATAHEADERSIZE + 1 ) ) 
02759     {
02760         // Os dados recebidos nao possuem bytes suficientes para o cabecalho 
02761         // mais algum conteudo (de pelo menos 1 byte). Entao os dados nao foram
02762         // enviados corretamente pelo outro lado da conexao.
02763         
02764         INTERFACELOG << "CNetInterface::ProcessData os dados nao foram "
02765                      << "corretamente recebidos para a transferencia associada "
02766                      << "ao IP " << inet_ntoa( ip ) << " e a porta " 
02767                      << ntohs( Port ) << ". Nenhuma callback sera chamada! "
02768                      << "Ignorando a mensagem!" << endl;
02769 
02770         #ifdef RIO_DEBUG1
02771         INTERFACELOG << "[CNetInterface - ProcessData] Finish1" << endl;
02772         #endif
02773         
02774         return;
02775     }
02776     
02777     // Copia o cabecalho dos dados. 
02778     memcpy( &DataHeader, Data, DATAHEADERSIZE );
02779     
02780     // Converte os campos da ordem de bytes da rede para a ordem de bytes da 
02781     // maquina.
02782     DataHeader.DataTransferID = ntohl( DataHeader.DataTransferID );
02783     DataHeader.DataType = ntohs( DataHeader.DataType );
02784     DataHeader.SourceTransferID = ntohl( DataHeader.SourceTransferID );
02785     
02786     // Atualiza o ponteiro Data para apontar para os dados efetivamente enviados
02787     // do outro lado (sem o cabecalho), assim como o tamanho dos dados dado em
02788     // DataSize.
02789     Data = &Data[ DATAHEADERSIZE ];
02790     DataSize = DataSize - DATAHEADERSIZE;
02791 
02792     #ifdef RIO_DEBUG2
02793     INTERFACELOG << "CNetInterface::ProcessData Recebida uma mensagem do IP " 
02794                  << inet_ntoa( ip ) << " e da porta " << ntohs( Port ) 
02795                  << " para a estrutura de trasnferencia com o ID " 
02796                  << DataHeader.DataTransferID << " com o tipo " 
02797                  << DataHeader.DataType << " a partir da estrutura de " 
02798                  << "transferencia origem com a ID " 
02799                  << DataHeader.SourceTransferID << ". O conteudo da mensagem " 
02800                  << "possui " << DataSize << " bytes no total." << endl;
02801     #endif
02802     
02803     RioStatus = m_TransferInfo->GetTransfer( DataHeader.DataTransferID, 
02804                                              &IPTransfer, &PortTransfer, 
02805                                              &FinalizeCallback, 
02806                                              &FinalizeCallbackParam, 
02807                                              &ProcessCallback, 
02808                                              &ProcessCallbackParam, 
02809                                              &DataTransfer, &DataTransferSize, 
02810                                              &TransferType );
02811     if( FAILED( RioStatus ) )
02812     {
02813         INTERFACELOG << "CNetInterface::ProcessData erro 0x" << hex << RioStatus 
02814                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
02815                      << "ao executar a funcao GetTransfer. O erro foi gerado "
02816                      << "para o par IP " << inet_ntoa( ip ) << ", a porta "
02817                      << ntohs( Port ) << ", com o Source ID "
02818                      << DataHeader.SourceTransferID << " e o Destination ID "
02819                      << DataHeader.DataTransferID << ". O pacote recebido tinha "
02820                      << "um tamanho de " << DataSize << " bytes, sendo "
02821                      << ", com esperado, " << DATAHEADERSIZE << " bytes usado "
02822                      << "pelo cabecalho. Ignorando a mensagem!" << endl;
02823 
02824         #ifdef RIO_DEBUG1
02825         INTERFACELOG << "[CNetInterface - ProcessData] Finish2" << endl;
02826         #endif
02827         
02828         return;
02829     }
02830 
02831     // Inicializa IPTransfer com a copia de IPTransfer;
02832     ipt.s_addr = IPTransfer;
02833     
02834     // Verificamos se o par IP, Porta passado a funcao e o mesmo associado a
02835     // transferencia cujo parametro foi passado como parametro.
02836     if( ( IPTransfer != 0 ) && ( PortTransfer != 0 ) && 
02837         ( ( IP != IPTransfer ) || ( Port != PortTransfer ) ) ) 
02838     {
02839         INTERFACELOG << "CNetInterface::ProcessData aviso: o IP "
02840                      << inet_ntoa( ipt ) << " e a porta " 
02841                      << ntohs( PortTransfer ) << " associados a transferencia "
02842                      << "com o ID " << DataHeader.DataTransferID << " nao sao " 
02843                      << "iguais ao IP " << inet_ntoa( ip ) << " e a porta " 
02844                      << ntohs( Port ) << " passados como parametros da funcao! "
02845                      << "Ignorando a mensagem!" << endl;
02846 
02847         #ifdef RIO_DEBUG1
02848         INTERFACELOG << "[CNetInterface - ProcessData] Finish3" << endl;
02849         #endif
02850         
02851         return;
02852     } 
02853     
02854     // Verifica se o tipo de transferencia e o adequado.
02855     if( TransferType != RECEIVINGDATA ) 
02856     {
02857         // Transferencia do tipo incorreto. Neste caso, nao podemos chamar a
02858         // callback e nem remover o buffer.
02859         INTERFACELOG << "CNetInterface::ProcessData a transferencia " 
02860                      << "associada ao IP " << inet_ntoa( ipt ) << " e a porta " 
02861                      << ntohs( PortTransfer ) << " nao e do tipo de " 
02862                      << "recebimento de dados. Nenhuma callback sera chamada! "
02863                      << "Ignorando a mensagem!" << endl;
02864 
02865         #ifdef RIO_DEBUG1
02866         INTERFACELOG << "[CNetInterface - ProcessData] Finish4" << endl;
02867         #endif
02868         
02869         return;
02870     }
02871     
02872     // O par IP, Porta da transferencia bate e o tipo de transferencia e de
02873     // recebimento de dados. Neste caso, primeiramente deveremos extrair dos
02874     // dados o cabecalho com o tipo de mensagem para definirmos o que sera feito 
02875     // com os dados. A callback chamada sera a ProcessCallbackParam se os dados 
02876     // estiverem associados a um comando (CMDDATA) ou a callback de finalizacao 
02877     // FinalizeCallback para todos os outros tipos.
02878         
02879     // Agora verificamos o tipo de dados, pois o que deveremos fazer dependera
02880     // do tipo de dados que foi recebido.
02881     switch( DataHeader.DataType )
02882     {
02883         // Foi recebida uma mensagem de erro interna. Neste caso, o ponteiro
02884         // Data devera apontar para um int, e DataSize deve ser igual ao
02885         // tamanho de um int. Neste caso deveremos chamar a callback de
02886         // finalizacao FinalizeCallback e depois remover a estrutura de
02887         // transferencia.
02888         case RSTDATA:
02889             // Verificamos se o tamanho do pacote e o adequado.
02890             if( DataSize != sizeof ( int ) )
02891             {
02892                 INTERFACELOG << "CNetInterface::ProcessData a mensagem do tipo "
02893                              << "RSTDATA recebida do par IP " 
02894                              << inet_ntoa( ip ) << " e a porta " 
02895                              << ntohs( Port ) << " estava com o tamanho "
02896                              << "incorreto: foram recebidos " << DataSize 
02897                              << " bytes quando o correto seria "
02898                              << sizeof( int ) << " bytes! Ignorando a mensagem!"
02899                              << endl;
02900 
02901                 #ifdef RIO_DEBUG1
02902                 INTERFACELOG << "[CNetInterface - ProcessData] Finish5" << endl;
02903                 #endif
02904                 
02905                 return;
02906             }
02907             
02908             // Copia o valor do erro para Result.
02909             memcpy( &Result, Data, sizeof( int ) );
02910             
02911             // Chamamos a callback com o erro.
02912             FinalizeCallback( FinalizeCallbackParam, Result );
02913             
02914             // Devemos remover a estrutura de transferencia.
02915             RemoveTrasnfer = true; 
02916             
02917             break;
02918             
02919         // Foi recebida uma mensagem com um comando. Neste caso, deveremos
02920         // simplesmente chamar a callback de processamento ProcessCallback e
02921         // nao remover a estrutura de transferencia (ela devera ser removida,
02922         // neste caso, quando uma mensagem RESULTDATA for recebida).
02923         case CMDDATA:
02924             // Verificamos se a estrutura de transferencia esta associada a um
02925             // recebimento de um comando (esta estrutura e a unica para a qual
02926             // ProcessCallback e diferente de NULL.
02927             if( ProcessCallback == NULL )
02928             {
02929                 INTERFACELOG << "CNetInterface::ProcessData a mensagem do tipo "
02930                              << "CMDDATA recebida do par IP " 
02931                              << inet_ntoa( ip ) << " e a porta " 
02932                              << ntohs( Port ) << " foi enviada para uma "
02933                              << "estrutura nao associada a um recebimento de "
02934                              << "um comando! Ignorando a mensagem!" << endl;
02935 
02936                 #ifdef RIO_DEBUG1
02937                 INTERFACELOG << "[CNetInterface - ProcessData] Finish6" << endl;
02938                 #endif
02939                 
02940                 return;
02941             }
02942 
02943             // Aqui simplesmente passamos o comando recebido a callback de
02944             // processamento.
02945             ProcessCallback( ProcessCallbackParam, Data, DataSize ); 
02946         
02947             // Nao devemos remover a estrutura de transferencia.
02948             RemoveTrasnfer = false; 
02949             
02950             break;
02951             
02952         // Foi recebida uma mensagem de resultado. Neste caso, o ponteiro
02953         // Data devera apontar para um int, e DataSize deve ser igual ao
02954         // tamanho de um int. Neste caso deveremos chamar a callback de
02955         // finalizacao FinalizeCallback e depois remover a estrutura de
02956         // transferencia. Esta mensagem e usada para terminar uma transferencia
02957         // iniciada por uma mensagem CMDDATA.
02958         case RESULTDATA:
02959             // Verificamos se o tamanho do pacote e o adequado.
02960             if( DataSize != sizeof ( int ) )
02961             {
02962                 INTERFACELOG << "CNetInterface::ProcessData a mensagem do tipo "
02963                              << "RESULTDATA recebida do par IP " 
02964                              << inet_ntoa( ip ) << " e a porta " 
02965                              << ntohs( Port ) << " estava com o tamanho "
02966                              << "incorreto: foram recebidos " << DataSize 
02967                              << " bytes quando o correto seria "
02968                              << sizeof( int ) << " bytes! Ignorando a mensagem!"
02969                              << endl;
02970 
02971                 #ifdef RIO_DEBUG1
02972                 INTERFACELOG << "[CNetInterface - ProcessData] Finish7" << endl;
02973                 #endif
02974                 
02975                 return;
02976             }
02977 
02978             // Copia o valor do erro para Result.
02979             memcpy( &Result, Data, sizeof( int ) );
02980             
02981             // Chamamos a callback com o erro.
02982             FinalizeCallback( FinalizeCallbackParam, Result ); 
02983             
02984             // Devemos remover a estrutura de transferencia.
02985             RemoveTrasnfer = true; 
02986 
02987             break;
02988             
02989         // Verificamos se a estrutura de transferencia esta associada ao 
02990         // recebimento de um bloco.   
02991         case BLOCKDATA:
02992             // Verificamos se a estrutura esta associada a um envio de dados
02993             // Neste caso DataTransfer deveria nao ser NULL (para as mensagens
02994             // CMDDATA e RESULTDATA podemos supor que DataTransfer e NULL, 
02995             // porque quando ProcessCallback nao e NULL DataTransfer e NULL e
02996             // vice-versa).
02997             if( DataTransfer == NULL )
02998             {
02999                 INTERFACELOG << "CNetInterface::ProcessData a mensagem do tipo "
03000                              << "BLOCKDATA recebida do par IP "  
03001                              << inet_ntoa( ip ) << " e a porta " 
03002                              << ntohs( Port ) << " para uma estrutura nao " 
03003                              << "associada ao recebimento de um bloco! "
03004                              << "Ignorando a mensagem!" << endl;
03005 
03006                 #ifdef RIO_DEBUG1
03007                 INTERFACELOG << "[CNetInterface - ProcessData] Finish8" << endl;
03008                 #endif
03009                 
03010                 return;
03011             }
03012             
03013             // Verificamos agora se recebemos todos os bytes do bloco.
03014             if( DataSize != DataTransferSize )
03015             {
03016                 INTERFACELOG << "CNetInterface::ProcessData a mensagem do tipo "
03017                              << "BLOCKDATA recebida do par IP " 
03018                              << inet_ntoa( ip ) << " e a porta " 
03019                              << ntohs( Port ) << " tem " << DataSize 
03020                              << " bytes, mas deveria ter " << DataTransferSize
03021                              << " bytes! Ignorando a mensagem!" << endl;
03022 
03023                 #ifdef RIO_DEBUG1
03024                 INTERFACELOG << "[CNetInterface - ProcessData] Finish9"
03025                              << endl;
03026                 #endif
03027                 
03028                 return;
03029             }  
03030             
03031             // Copia os dados para o buffer passado quando SendData foi chamado.
03032             memcpy( DataTransfer, Data, DataSize );
03033                       
03034             // Chama a callback informando que o bloco foi recebido com 
03035             // sucesso.
03036             FinalizeCallback( FinalizeCallbackParam, S_OK ); 
03037 
03038             // Devemos remover a estrutura de transferencia.
03039             RemoveTrasnfer = true; 
03040 
03041             break;
03042         
03043         // Neste caso recebemos um tipo invalido de mensagem que sera entao
03044         // ignorado. Um erro, porem, sera enviado ao outro lado.    
03045         default:
03046             INTERFACELOG << "CNetInterface::ProcessData a mensagem de tipo "
03047                          << DataHeader.DataType << " invalido recebida do par "
03048                          << "IP " << inet_ntoa( ip ) << " e a porta " 
03049                          << ntohs( Port ) << ". Ignorando a mensagem!" << endl;
03050 
03051             #ifdef RIO_DEBUG1
03052             INTERFACELOG << "[CNetInterface - ProcessData] Finish10" << endl;
03053             #endif
03054             
03055             return;
03056             
03057             break;
03058     }
03059     
03060     // Verifica se devemos remover a estrutura de transferencia e, se 
03061     // necessario, tentamos remove-la.
03062     if( RemoveTrasnfer )
03063     {
03064         RioStatus = m_TransferInfo->RemoveTransfer( DataHeader.DataTransferID );
03065         if( FAILED( RioStatus ) )
03066         {
03067             INTERFACELOG << "CNetInterface::ProcessData erro 0x" << hex 
03068                          << RioStatus << dec << " (" 
03069                          << GetErrorDescription( RioStatus ) << ") ao executar "
03070                          << "a funcao RemoveTransfer. O erro foi gerado para "
03071                          << "o par IP " << inet_ntoa( ip ) << " e a porta " 
03072                          << ntohs( Port ) << "." << endl;
03073         }
03074     }
03075 
03076     #ifdef RIO_DEBUG1
03077     INTERFACELOG << "[CNetInterface - ProcessData] Finish11" << endl;
03078     #endif
03079 
03080     return;
03081 }

void CNetInterface::ProcessError ( int  IP,
int  Port,
RioResult  RioError,
const char *  Msg,
EErrorType  ErrorType,
void *  Param 
)

Esta funcao e chamada quando algum erro ocorrer com a transferencia de dados.

Parameters:
IP endereco IP da maquina associada ao socket com o erro.
Port porta associada ao socket com erro
RioError erro que ocorreu na transferencia dos dados.
Msg Mensagem a ser impressa junto com o erro (usada para sabermos onde o erro foi gerado)
ErrorType tipo do erro que foi gerado (se foi gerado por um recebimento de dados, por um envio de dados, ou por um outro motivo).
Param parametro generico opcional passado a funcao. No nosso caso, quando nao NULL, contem o identificador da transferencia associada ao erro (isso somente e usado pelo envio dos dados, no recebimento, e passado sempre NULLTRANSFERID).

Definition at line 3238 of file NetInterface.cpp.

03241 {
03242     // Armazena o identificador para a estrutura criada para enviar os dados
03243     // ao outro lado (passado como parametro a funcao, se nao for NULL).
03244     TTransferID TransferID;
03245     // Armazena o resultado da execucao das funcoes do RIO.
03246     RioResult RioStatus;
03247     // Armazena o IP guardado na estrutura da transferencia com o ID TransferID.
03248     int IPTransfer;
03249     // Armazena a porta guardada na estrutura da transferencia com o ID 
03250     // TransferID.
03251     int PortTransfer;
03252     // Armazena a callback de finalizacao associada a transferencia.
03253     callback_t FinalizeCallback;
03254     // Armazena o parametro que deve ser passado quando a callback 
03255     // FinalizeCallback for chamada.
03256     void *FinalizeCallbackParam;
03257     // Armazena a callback de processamento de dados recebidos (somente usada 
03258     // quando mensagens com comandos, do tipo CMDDATA, sao enviadas para o 
03259     // outro lado).
03260     cmdcallback_t ProcessCallback;
03261     // Armazena o parametro que deve ser passado quando a callback 
03262     // ProcessCallbackParam for chamada.
03263     void *ProcessCallbackParam;
03264     // Armazena o ponteiro para os dados que foram enviados (e aqui que vamos
03265     // remover este buffer, apos chamarmos a callback FinalizeCallback).
03266     char *Data;
03267     // Armazena o tamanho em bytes dos dados apontados por Data.
03268     unsigned int DataSize;
03269     // Armazena o tipo da transferencia (se e para envio de dados, o correto 
03270     // para esta chamada ou recebimento de dados, que seria incorreto para 
03271     // esta chamada).
03272     ETransferType TransferType;
03273     // Armazena o identificador, no outro lado, do destino dos dados em yuma
03274     // transferencia de envio de dados.
03275     TTransferID DestTransferID;
03276     // Armazena uma copia do IP para ser usadao pela funcao inet_ntoa do 
03277     // parametro IP e uma copia, tambem para ser usada pela funcao  inet_ntoa,
03278     // do parametro IPTransfer.
03279     in_addr ip, ipt;
03280 
03281     #ifdef RIO_DEBUG1
03282     INTERFACELOG << "[CNetInterface - ProcessError] Start" << endl;
03283     #endif
03284     
03285     // Inicializa o campo TransferID de acordo com Param (atualmente, este valor 
03286     // e um identificador valido quando erros ocorrem no envio de dados, mas e
03287     // NULLTRANSFERID quando recebemos dados, pois a ID da transferencia neste
03288     // caso esta dentro dos dados recebidos).
03289     TransferID = ( TTransferID ) ( TLTransferID ) Param;
03290 
03291     // Imprime a informacao do erro (isso deve estar dentro de RIO_DEBUG2?)    
03292     ip.s_addr = IP;
03293     
03294     INTERFACELOG << "[ProcessError] " << Msg << ": erro 0x" << hex << RioError 
03295                  << dec << " (" << GetErrorDescription( RioError ) << ") "
03296                  << "recebido do objeto de uma das classes de envio de dados. "
03297                  << "O erro foi gerado para o par IP " << inet_ntoa( ip ) 
03298                  << " e a porta " << ntohs( Port ) << "." << endl;
03299                  
03300     // Faz as finalizacoes dependendo do erro chamado.
03301     switch( ErrorType )
03302     {
03303         // Ocorreu um erro ao recebermos dados por uma conexao TCP. Neste caso,
03304         // Chamaremos a funcao da classe m_TransferInfo para varrer a cache e
03305         // remover todas as transferencias de leitura pendentes para o par IP,
03306         // porta dado (note que este par IP, porta deveria ser diferente de 0).
03307         case RECEIVEERROR:
03308             #ifdef RIO_DEBUG2
03309             INTERFACELOG << "CNetInterface::ProcessError Recebido o erro tipo " 
03310                          << "RECEIVEERROR para o par IP " << inet_ntoa( ip ) 
03311                          << " e a porta " << ntohs( Port ) << ". Fechando "
03312                          << "todas as conexoes de leitura!" << endl;
03313             #endif
03314 
03315             // Executa a funcao FinalizeAllTransfers para finalizarmos todas as 
03316             // trasnferencias de leitura de dados pendentes.
03317             RioStatus = m_TransferInfo->FinalizeAllTransfers( IP, Port, 
03318                                                               RECEIVINGDATA, 
03319                                                               RioError );
03320             if( FAILED( RioStatus ) )
03321             {
03322                 #ifdef RIO_DEBUG2
03323                 INTERFACELOG << "CNetInterface::ProcessError erro 0x" << hex 
03324                              << RioStatus << dec << " (" 
03325                              << GetErrorDescription( RioStatus ) << ") ao "
03326                              << "executar a funcao FinalizeAllTransfers para o "
03327                              << "par IP " << inet_ntoa( ip ) << " e a porta " 
03328                              << ntohs( Port ) << "." << endl;
03329 
03330                 #endif     
03331                 
03332                 #ifdef RIO_DEBUG1
03333                 INTERFACELOG << "[CNetInterface - ProcessError] Finish1" 
03334                              << endl;
03335                 #endif
03336  
03337                 return;                      
03338             }               
03339             break;
03340 
03341         // Neste caso, ocorreu um erro ao enviarmos os dados. Se TransferID,
03342         // dado por param, for diferente de NULLTRANSFERID, entao tentamos
03343         // chamar a callback associada a transfer com a ID TransferID para 
03344         // informar que ocorreu um erro ao enviarmos os dados.
03345         case SENDERROR:
03346             // Chama a callback e remove a transferencia, se TransferID for 
03347             // diferente de NULLTRANSFERID. 
03348             if( TransferID != NULLTRANSFERID )
03349             {
03350                 RioStatus = m_TransferInfo->GetTransfer( TransferID, 
03351                                                          &IPTransfer, 
03352                                                          &PortTransfer, 
03353                                                          &FinalizeCallback, 
03354                                                          &FinalizeCallbackParam, 
03355                                                          &ProcessCallback, 
03356                                                          &ProcessCallbackParam, 
03357                                                          &Data, &DataSize, 
03358                                                          &TransferType, 
03359                                                          &DestTransferID );
03360                 if( FAILED( RioStatus ) )
03361                 {
03362                     INTERFACELOG << "CNetInterface::ProcessError erro 0x" << hex 
03363                                  << RioStatus << dec << " (" 
03364                                  << GetErrorDescription( RioStatus ) << ") ao "
03365                                  << "executar a funcao GetTransfer. O erro foi "
03366                                  << "gerado para o par IP " << inet_ntoa( ip ) 
03367                                  << " e a porta " << ntohs( Port ) << ", e a "
03368                                  << " transferencia com a ID " << TransferID 
03369                                  << "." << endl;
03370                      
03371                     #ifdef RIO_DEBUG1
03372                     INTERFACELOG << "[CNetInterface - ProcessError] Finish2" 
03373                                  << endl;
03374                     #endif
03375  
03376                     return;                      
03377                 }
03378 
03379                 // Inicializa IPTransfer com a copia de IPTransfer;
03380                 ipt.s_addr = IPTransfer;
03381     
03382                 // Verificamos se o par IP, Porta passado a funcao e o mesmo 
03383                 // associado a transferencia cujo parametro foi passado como 
03384                 // parametro. 
03385                 if( ( IP != IPTransfer ) || ( Port != PortTransfer ) ) 
03386                 {
03387                     INTERFACELOG << "CNetInterface::ProcessError aviso: o IP " 
03388                                  << inet_ntoa( ipt ) << " e a porta " 
03389                                  << ntohs( PortTransfer ) << " associados a "
03390                                  << "transferencia com o ID " << TransferID 
03391                                  << " nao sao iguais ao IP " << inet_ntoa( ip ) 
03392                                  << " e a porta " << ntohs( Port ) 
03393                                  << " passados como parametros da funcao." 
03394                                  << endl;
03395         
03396                      #ifdef RIO_DEBUG1
03397                      INTERFACELOG << "[CNetInterface - ProcessError] Finish3" 
03398                                   << endl;
03399                      #endif
03400         
03401                      return;
03402                 } 
03403                
03404                 // Verificamos se o tipo da transferencia e de envio de dados.
03405                 if( TransferType != SENDINGDATA )
03406                 {
03407                     INTERFACELOG << "CNetInterface::ProcessError O tipo da "
03408                                  << "transferencia associada ao par IP " 
03409                                  << inet_ntoa( ip ) << " e a porta " 
03410                                  << ntohs( Port ) << ", com o ID " << TransferID 
03411                                  << " nao e uma transferencia de envio de "
03412                                  << "dados!" << endl;
03413         
03414                      #ifdef RIO_DEBUG1
03415                      INTERFACELOG << "[CNetInterface - ProcessError] Finish4" 
03416                                   << endl;
03417                      #endif
03418         
03419                      return;
03420                 }
03421 
03422                 // O par IP, Porta da transferencia bate e o tipo de 
03423                 // transferencia e de envio. Entao, chamamos a callback e 
03424                 // removemos o dado e a transferencia.
03425                 
03426                 // Se ocorreu um erro no envio dos dados, entao deveremos 
03427                 // enviar um erro ao outro lado da conexao, para que a espera 
03428                 // pelo dado possa ser abortada, gerando um erro.
03429                 SendRst( IP, Port, DestTransferID, RioError );
03430 
03431                 // Chama a callback de finalizacao associada a transferencia de 
03432                 // escrita, se ela nao for nula, ou seja, se um ponteiro para 
03433                 // uma callback foi passado quando enviamos os dados.
03434                 if( FinalizeCallback != NULL )
03435                     FinalizeCallback( FinalizeCallbackParam, RioError );
03436         
03437                 // Deleta o buffer com os dados que ja foram enviados com 
03438                 // sucesso.
03439                 delete[] Data;
03440         
03441                 // Remove a estrutura de transferencia da lista com todas as 
03442                 // transferencias.
03443                 RioStatus = m_TransferInfo->RemoveTransfer( TransferID );
03444                 if( FAILED( RioStatus ) )
03445                 {
03446                     #ifdef RIO_DEBUG2
03447                     INTERFACELOG << "CNetInterface::ProcessError erro 0x" << hex 
03448                                  << RioStatus << dec << " (" 
03449                                  << GetErrorDescription( RioStatus ) << ") ao "
03450                                  << "executar a funcao RemoveTransfer. O erro "
03451                                  << "foi gerado para o par IP " 
03452                                  << inet_ntoa( ip ) << " e a porta " 
03453                                  << ntohs( Port ) << "." << endl;
03454                     #endif
03455                    
03456                     #ifdef RIO_DEBUG1
03457                     INTERFACELOG << "[CNetInterface - ProcessError] Finish5" 
03458                                  << endl;
03459                     #endif
03460         
03461                     return;
03462                    
03463                 }
03464             }
03465             
03466             // Outros tipos de erros. Neste caso, nao precisamos fazer nenhuma
03467             // acao.
03468             case OTHERERROR:
03469                 #ifdef RIO_DEBUG2
03470                 INTERFACELOG << "CNetInterface::ProcessError Recebido o erro " 
03471                              << "tipo OTHERERROR para o par IP " 
03472                              << inet_ntoa( ip ) << " e a porta " 
03473                              << ntohs( Port ) << ". Nenhuma acao precisa ser " 
03474                              << "tomada!" << endl;
03475                 #endif
03476                 break;
03477             
03478             // Foi passado um tipo de dado incorreto
03479             default:
03480                 #ifdef RIO_DEBUG2
03481                 INTERFACELOG << "CNetInterface::ProcessError Foi passado um " 
03482                              << "tipo de erro " << ErrorType << " invalido ao "
03483                              << "chamar a funcao para o par IP "
03484                              << inet_ntoa( ip ) << " e a porta " 
03485                              << ntohs( Port ) << ". Chamada ignorada!" << endl;
03486                 #endif
03487                 break; 
03488     }
03489     
03490     #ifdef RIO_DEBUG1
03491     INTERFACELOG << "[CNetInterface - ProcessError] Finish6" << endl;
03492     #endif
03493 }

void CNetInterface::ProcessTransferIDs ( void *  CmdParam,
char *  Command,
int  CommandSize 
) [static, private]

Funcao de callback usada pela funcao ExpectTellId para processar os identificadores recebidos dos servidores de armazenamento e enviar, usando estes identificadores, os blocos para os servidores de armazenamento.

Parameters:
CmdParam parametro passado quando a funcao ExpectCmd foi chamada em ExpectTellId (um ponteiro para uma estrutura do tipo TTellIdData).
Command comando (enviado pela funcao TellId) recebido de um servidor de armazenamento.
CommandSize tamanho em bytes do comando.

Definition at line 2029 of file NetInterface.cpp.

02031 {
02032     // Vetor para criar o comando a ser enviado pela rede.
02033     u32 *TellIdCmd;
02034     // Ponteiro para a estrutura com as informacoes para processarmos os 
02035     // comandos enviados pelos servidores de armazenamento necessarios para
02036     // obtermos os identificadores de transferencia para o envio dos blocos.
02037     TTellIdData *TellIdData;
02038 
02039     // Obtem o ponteiro para a estrutura NewData.
02040     TellIdData = ( TTellIdData * ) CmdParam;
02041 
02042     #ifdef RIO_DEBUG1
02043     STATICINTERFACELOG << "[CNetInterface - ProcessTransferID] Start" << endl;
02044     #endif
02045     
02046     // Obtem os campos enviados no comando, verificando se algum erro ocorreu
02047     // ao receber um comando.
02048     //
02049     // Obs: O que fazer no caso de um comando errado? Abortar tudo e reportar
02050     // um erro?
02051     //
02052     if( CommandSize != CMD_TELLID_BYTESIZE )
02053     {
02054         // Ocorreu um erro ao enviar o comando, pois o tamanho do comando nao
02055         // esta correto. O que fazer neste caso, ja que nao temos uma ID para
02056         // enviar o bloco ao storage com o erro? Chamar a callback nao e 
02057         // correto, e tambem nao posso enviar uma mensagem ao servidor de 
02058         // armazenamento pois nao temos o IP, porta dele. Vou simplesmente 
02059         // ignorar a ID, mas talvez precisemos decidir o que sera feito neste
02060         // caso (e no seguinte, quando o comando tem o tamanho correto mas nao
02061         // tem o tipo correto).
02062         
02063         #ifdef RIO_DEBUG2
02064         STATICINTERFACELOG << "CNetInterface::ProcessTransferIDs recebido um "
02065                            << "comando com tamanho invalido. Tamanho = " 
02066                            << CommandSize << "bytes (esperado " 
02067                            << CMD_TELLID_BYTESIZE << " bytes), comando = " 
02068                            << hex;
02069         for( int i = 0; i < CommandSize; i++ )
02070         {
02071             STATICINTERFACELOG << "0x" << ( unsigned short ) Command[ i ];
02072             if( i != ( CommandSize - 1 ) )
02073                 STATICINTERFACELOG << ",";
02074             else
02075                 STATICINTERFACELOG << "." << dec << endl;
02076         }
02077         #endif
02078 
02079         #ifdef RIO_DEBUG1
02080         STATICINTERFACELOG << "[CNetInterface - ProcessTransferID] Finish1" 
02081                            << endl;
02082         #endif
02083     }
02084     else
02085     {
02086         // Coloca os dados em um vetor com 4 entradas do tipo u32, e converte
02087         // os valores convertidos na funcao TellId para a ordem da rede 
02088         // novamente para a ordem da maquina.
02089         TellIdCmd = ( u32 * ) Command; 
02090         // Converte o identificador do comando.
02091         TellIdCmd[ 0 ] = ntohl( TellIdCmd[ 0 ] );
02092         // Converte a porta (de um inteiro de 32 bits para um inteiro de 16 
02093         // bits).
02094         TellIdCmd[ 2 ] = htons( ( short ) ( ntohl( TellIdCmd[ 2 ] ) ) ); 
02095         // Converte a ID de transferencia recebida da ordem da rede para a ordem
02096         // da maquina (pois a funcao SendData espera a ID no formato da 
02097         // maquina). 
02098         TellIdCmd[ 3 ] = ntohl( TellIdCmd[ 3 ] );
02099         
02100         // Verifica se o comando e um comando enviado pela execucao da funcao
02101         // TellId.
02102         if( TellIdCmd[ 0 ] == CMD_TELLID )
02103         {
02104             #ifdef RIO_DEBUG2
02105             in_addr ip;
02106             ip.s_addr = TellIdCmd[ 1 ];
02107             STATICINTERFACELOG << "CNetInterface::ProcessTransferIDs tentando "
02108                                << "enviar um bloco ao endereco IP " 
02109                                << inet_ntoa( ip ) << " e a porta " 
02110                                << ntohs( TellIdCmd[ 2 ] ) << ", usando a "
02111                                << "transferencia com o ID " << TellIdCmd[ 3 ] 
02112                                << ", a partir da transferencia local com a ID " 
02113                                << TellIdData->SentDataTransfer << "." << endl;
02114             #endif           
02115             
02116             // Envia o bloco para o par IP, porta indicado por TellIdCmd[ 1 ] 
02117             // (IP), TellIdCmd[ 1 ] (porta), usando a ID de transferencia dada 
02118             // em TellIdCmd[ 3 ] (ID da transferencia).
02119             TellIdData->NetInterface->SendBlock( TellIdCmd[ 1 ], TellIdCmd[ 2 ], 
02120                             ( TTransferID ) TellIdCmd[ 3 ], TellIdData->Buffer,
02121                            TellIdData->BufferSize, NULL, NULL );
02122                        
02123             #ifdef RIO_DEBUG2
02124             STATICINTERFACELOG << "CNetInterface::ProcessTransferIDs um bloco "
02125                                << " foi enviado ao endereco IP " 
02126                                << inet_ntoa( ip ) << " e a porta " 
02127                                << ntohs( TellIdCmd[ 2 ] ) << ", e foi "
02128                                << "associado a transferencia com o ID " 
02129                                << TellIdCmd[ 3 ] << ", a partir da "
02130                                << "transferencia local com a ID " 
02131                                << TellIdData->SentDataTransfer << "." << endl;
02132             #endif           
02133 
02134             #ifdef RIO_DEBUG1
02135             STATICINTERFACELOG << "[CNetInterface - ProcessTransferID] Finish2" 
02136                                << endl;
02137             #endif
02138             
02139         }
02140         else
02141         {
02142             // Ocorreu um erro ao enviar o comando, pois o tipo do comando nao
02143             // esta correto. O que fazer neste caso, ja que nao temos uma ID 
02144             // para enviar o bloco ao storage com o erro? Chamar a callback nao 
02145             // e correto, e tambem nao posso enviar uma mensagem ao servidor de 
02146             // armazenamento pois nao temos o IP, porta dele. Vou simplesmente 
02147             // ignorar a ID, mas talvez precisemos decidir o que sera feito 
02148             // neste caso (e no anterior, quando o comando tem o tamanho correto
02149             // mas nao tem o tipo correto).
02150 
02151             #ifdef RIO_DEBUG2
02152             STATICINTERFACELOG << "CNetInterface::ProcessTransferIDs recebido "
02153                                << "um comando com o tipo invalido, apesar de o "
02154                                << "tamanho estar correto. Tamanho = "   
02155                                << CommandSize << "bytes, comando = " << hex;
02156             for( int i = 0; i < CommandSize; i++ )
02157             {
02158                 STATICINTERFACELOG << "0x" << ( unsigned short ) Command[ i ];
02159                 if( i != ( CommandSize - 1 ) )
02160                     STATICINTERFACELOG << ",";
02161                 else
02162                     STATICINTERFACELOG << "." << dec << endl;
02163             }
02164             #endif
02165 
02166             #ifdef RIO_DEBUG1
02167             STATICINTERFACELOG << "[CNetInterface - ProcessTransferID] Finish3" 
02168                                << endl;
02169             #endif
02170         }
02171     }
02172 
02173     #ifdef RIO_DEBUG1
02174     STATICINTERFACELOG << "[CNetInterface - ProcessTransferID] Finish4" << endl;
02175     #endif
02176 }

void CNetInterface::SendBlock ( int  ipadr,
int  port,
TTransferID  TransferID,
char *  bufadr,
int  buflen,
callback_t  callback,
void *  callbackparm,
bool  UseTCP = true,
unsigned int  VideoRate = 0 
)

Funcao para enviar um bloco de um dos arquivos armazenados em um dos storages do RIO, ou para enviar um bloco de um arquivo resultante de uma busca nos logs, para o par ipadr, port do destino.

Parameters:
ipadr endereco IP para o qual o bloco deve ser enviado.
port porta para o qual o bloco deve ser enviado.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do bloco a ser enviado.
bufadr endereco com os dados do bloco.
buflen tamanho do bloco em bytes.
callback callback a ser chamada quando o bloco for enviado com sucesso ao destino.
callbackparm parametro a ser passado pela callback.
UseTCP valor booleano que, se false, indica que o bloco deve ser enviado em tempo real (via UDP sem retransmissao) e, se for true, indica que o bloco deve ser enviado em tempo nao real (usando a conexao TCP). Este paramtro e opcional e tem o valor default de true (usar a conexao TCP).
VideoRate taxa de transmissao do video (somente nas transferencias em tempo real). A taxa define define, caso estejamos estejamos enviando trafego em tempo real (os videos) a taxa de transmissao do video em Kbps. Como ele somente e usado pelo servidor de armazenamento, ele possui um valor default de 0, para que nao seja necessario alterarmos o codigo do cliente e do servidor de despacho.

Obs: O que vamos fazer neste caso da transferencia em tempo real? O metodo que pensamos antes de criar uma classe abstrata pode nao ser adequado, pois nao sei se sera possivel simular a transferencia em tempo real e o multicast usando o TCP e, se isso for verdade, precisaremos criar objetos das duas classes (CNetTcp e CNetUdp) e avaliarmos o que vamos fazer em casos de conflido do uso dos objetos das duas classes (por exemplo, isso ocorrera com as funcoes que obtem os pares IP,porta descritas anteriormente). Obs2: Por enquanto, somente as copias em tempo nao real serao feitas pela funcao. As outras copias chamarao imediatamente a callback com o erro ERROR_NETINTERFACE + ERROR_INVALID_TRAFFIC (o erro que identifica a classe mais o erro de trafego invalido).

Definition at line 1674 of file NetInterface.cpp.

01678 {
01679     // Armazena o resultado ao executarmos as funcoes do RIO.
01680     RioResult RioStatus;
01681     
01682     #ifdef RIO_DEBUG2
01683     // Usado para armazenar o IP para impressao.
01684     in_addr ip;
01685 
01686     ip.s_addr = ipadr;   
01687     #endif
01688 
01689     #ifdef RIO_DEBUG1
01690     INTERFACELOG << "[CNetInterface - SendBlock] Start" << endl;
01691     #endif
01692 
01693     // Primeiramente verificamos se a copia e em tempo nao real (eu estou 
01694     // supondo que o multicast e em tempo real). O parametro VideoRate por 
01695     // enquanto nao sera usado.
01696     if( UseTcp )
01697     {
01698         #ifdef RIO_DEBUG2                      
01699         INTERFACELOG << "CNetInterface::SendBlock usando o TCP ao enviar o "
01700                      << "bloco ao endereco IP " << inet_ntoa( ip ) << "e a "
01701                      << "porta " << ntohs( port ) << " usando a transferencia "
01702                      << "com a ID " << TransferID << "." << endl; 
01703         #endif
01704     }
01705     else
01706     {
01707         #ifdef RIO_DEBUG2                      
01708         INTERFACELOG << "CNetInterface::SendBlock usando o UDP ao enviar o "
01709                      << "bloco ao endereco IP " << inet_ntoa( ip ) << "e a "
01710                      << "porta " << ntohs( port ) << " usando a transferencia "
01711                      << "com a ID " << TransferID << "." << endl; 
01712         #endif
01713         
01714         // Se o trafego for em tempo nao real, por enquanto isso sera um erro,
01715         // porque a classe UDP ainda nao foi implementada. Quando a classe UDP
01716         // for implementada, as linhas ate o comentario // UseTcp = false; 
01717         // deverao ser removidas, e deveremos remover este comentario.
01718 
01719         #ifdef RIO_DEBUG2                      
01720         INTERFACELOG << "CNetInterface::SendBlock erro ao enviar o bloco ao "
01721                      << "endereco IP " << inet_ntoa( ip ) << " e a porta " 
01722                      << ntohs( port ) << " porque a copia em tempo real via "
01723                      << "UDP ainda nao foi implementada. Chamando a callback "
01724                      << "com o erro 0x" << hex 
01725                      << ERROR_NETINTERFACE + ERROR_INVALID_TRAFFIC << dec 
01726                      << " (" << GetErrorDescription( ERROR_NETINTERFACE + 
01727                                                      ERROR_INVALID_TRAFFIC )
01728                      << ")." << endl;
01729         #endif                
01730 
01731         // Chama a callback, pois a implementacao para os trafegos alem do te,po
01732         // nao real ainda nao foram implementadas (e deveriam usar a NetMgr e a
01733         // RioNeti). 
01734         callback( callbackparm, ERROR_NETINTERFACE + ERROR_INVALID_TRAFFIC );
01735 
01736         #ifdef RIO_DEBUG1
01737         INTERFACELOG << "[CNetInterface - SendBlock] Finish1" << endl;
01738         #endif
01739         
01740         return;
01741     }
01742 
01743     // Tenta criar uma nova mensagem do tipo comando e envia-la ao endereco de
01744     // destino.
01745     RioStatus = SendData( ipadr, port, callback, callbackparm, bufadr, buflen,
01746                           BLOCKDATA, UseTcp, TransferID );
01747     
01748     #ifdef RIO_DEBUG2                      
01749     if( FAILED( RioStatus ) )
01750     {
01751         INTERFACELOG << "CNetInterface::SendBlock erro 0x" << hex << RioStatus 
01752                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
01753                      << "ao enviar o bloco ao endereco IP " << inet_ntoa( ip ) 
01754                      << " e a porta " << ntohs( port ) << "." << endl;
01755     }               
01756 
01757     INTERFACELOG << "CNetInterface::SendBlock enviado o bloco ao endereco "
01758                  << "endereco IP " << inet_ntoa( ip ) << " e a porta " 
01759                  << ntohs( port ) << " para a transferencia com a ID "
01760                  << TransferID << "." << endl;
01761     #endif                      
01762 
01763     #ifdef RIO_DEBUG1
01764     INTERFACELOG << "[CNetInterface - SendBlock] Finish2" << endl;
01765     #endif
01766 }

void CNetInterface::SendCmd ( int  ipadr,
int  port,
TTransferID  TransferID,
char *  cmdp,
int  cmdl,
callback_t  callback,
void *  callbackparm 
)

Funcao para enviar uma mensagem do tipo comando ao endereco ipadr, port destino, passando o comando dado em cmdp (com o tamanho de cmdl).

Parameters:
ipadr endereco IP para o qual o comando deve ser enviado.
port porta para o qual o comando deve ser enviado.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do comando a ser enviado.
cmdp ponteiro para o comando a ser enviado.
cmdl tamanho do comandio a ser enviado.
callback callback a ser chamada quando o comando foi enviado com sucesso ao outro lado? Ele nao espera por um result?
callbackparm parametro a ser passado a callback quando ela for chamada.

Definition at line 1579 of file NetInterface.cpp.

01582 {
01583     // Armazena o resultado ao executarmos as funcoes do RIO.
01584     RioResult RioStatus;
01585     
01586     #ifdef RIO_DEBUG2
01587     // Usado para armazenar o IP para impressao.
01588     in_addr ip;
01589 
01590     ip.s_addr = ipadr;   
01591     #endif
01592 
01593     #ifdef RIO_DEBUG1
01594     INTERFACELOG << "[CNetInterface - SendCmd] Start" << endl;
01595     #endif
01596 
01597     // Tenta criar uma nova mensagem do tipo comando e envia-la ao endereco de
01598     // destino.
01599     RioStatus = SendData( ipadr, port, callback, callbackparm, cmdp, cmdl,
01600                           CMDDATA, true, TransferID );
01601     
01602     #ifdef RIO_DEBUG2                      
01603     if( FAILED( RioStatus ) )
01604     {
01605         INTERFACELOG << "CNetInterface::SendCmd erro 0x" << hex << RioStatus 
01606                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
01607                      << "ao enviar o comando ao endereco IP " << inet_ntoa( ip ) 
01608                      << " e a porta " << ntohs( port ) << "." << endl;
01609     }               
01610     #endif         
01611 
01612     #ifdef RIO_DEBUG2
01613     INTERFACELOG << "CNetInterface::SendCmd enviando um comando ao endereco "
01614                  << "endereco IP " << inet_ntoa( ip ) << " e a porta " 
01615                  << ntohs( port ) << " para a transferencia com a ID "
01616                  << TransferID << "." << endl;
01617     #endif                      
01618 
01619     #ifdef RIO_DEBUG1
01620     INTERFACELOG << "[CNetInterface - SendCmd] Finish" << endl;
01621     #endif
01622 }

RioResult CNetInterface::SendData ( int  IP,
int  Port,
callback_t  FinalizeCallback,
void *  FinalizeCallbackParam,
char *  Data,
unsigned int  DataSize,
EDataType  DataType,
bool  UseTCP,
TTransferID  DestTransferID,
TTransferID TransferID = NULL 
) [private]

Funcao para criar uma nova estrutura de transferencia e enviar os dados passados como parametro, anexando no inicio dos dados o cabecalho que informa o tipo de dados (passado como parametro) e o identificador da transferencia do outro lado da conexao para a qual os dados serao enviados.

Parameters:
IP endereco destino dos dados.
Port porta no endereco destino para a qual os dados serao enviados.
FinalizeCallback callback chamada quando finalizamos a transferencia.
CallbackParam valor a ser passado quando chamarmos a callback FinalizeCallback.
Data ponteiro para os dados a serem enviados.
DataSize numero de bytes nos dados a serem enviados.
DataType tipo dos dados (ver o tipo EDataType).
DestTransferID identificador associado ao envio destes dados no outro lado da conexao (ou seja, o identificador no IP, porta destino associado aos dados que serao enviados).
UseTCP se true os dados devem ser enviados usando o objeto da classe CNetTCP e, se false, devem ser enviados usando o objeto da classe CNetUDP.
TransferID ponteiro para armazenar o identificador associado a estrutura criada para o envio dos dados. Se for NULL, o identificador nao sera armazenado.
Returns:
S_OK se os dados foram criados e colocados com sucesso para serem enviados na fila do socket do par IP, porta passado como parametro, ou o codigo de erro de algo der errado.

Definition at line 769 of file NetInterface.cpp.

00775 {
00776     // Armazena os codigos de erro do RIO retornado pelas funcoes.
00777     RioResult RioStatus, RioStatus2; 
00778     // Armazena os dados a serem enviados pelo par IP, Port (o cabecalho mais
00779     // os dados do endereco apontado por Data) .
00780     char *RawData;
00781     // Armazena o tamanho dos dados a serem enviados.
00782     unsigned int RawDataSize;
00783     // Estrutura com o cabecalho dos dados a serem enviados.
00784     SDataHeader DataHeader;
00785     // Armazena temporariamente a ID retornada por NewTransfer
00786     TTransferID AuxTransferID;
00787     
00788     #ifdef RIO_DEBUG2
00789     in_addr ip;
00790     
00791     ip.s_addr = IP;
00792     #endif
00793 
00794     #ifdef RIO_DEBUG1
00795     INTERFACELOG << "[CNetInterface - SendData] Start" << endl;
00796     #endif
00797     
00798     // Inicializa o identificador de transferencia (se passado).
00799     if( TransferID != NULL )
00800         *TransferID = NULLTRANSFERID;
00801     
00802     // Primeiramente tentamos alocar um novo buffer para armazenar o cabecalho
00803     // mais os dados.
00804     RawDataSize = DataSize + sizeof( DataHeader );
00805     try
00806     {
00807         RawData = new char[ RawDataSize ];
00808     }
00809     catch( bad_alloc& ba )
00810     {
00811         #ifdef RIO_DEBUG2
00812         INTERFACELOG << "CNetInterface::SendData Erro de alocacao de memoria ("
00813                      << "bad_alloc, error = " << ba.what() << ") ao criar o "
00814                      << "buffer com o cabecalho mais os dados a serem "
00815                      << "enviados. Nao foi possivel enviar os dados ao IP "
00816                      << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) 
00817                      << endl;
00818         #endif
00819 
00820         #ifdef RIO_DEBUG1
00821         INTERFACELOG << "[CNetInterface - SendData] Finish1" << endl;
00822         #endif
00823         
00824         return ERROR_NETINTERFACE + ERROR_MEMORY;
00825     }
00826     
00827     // Tenta agora criar uma nova estrutura no objeto da classe de gerenciamento
00828     // de estruturas.
00829     RioStatus = m_TransferInfo->NewTransfer( IP, Port, FinalizeCallback,
00830                                              FinalizeCallbackParam, NULL, NULL, 
00831                                              RawData, RawDataSize, SENDINGDATA, 
00832                                              DestTransferID, &AuxTransferID );
00833                                              
00834     if( FAILED( RioStatus ) )
00835     {
00836         #ifdef RIO_DEBUG2
00837         INTERFACELOG << "CNetInterface::SendData Erro 0x" << hex << RioStatus 
00838                      << dec << " (" << GetErrorDescription( RioStatus ) 
00839                      << ") ao executar a funcao NewTransfer do objeto " 
00840                      << "m_TransferInfo ao criar uma estrutura para ser "
00841                      << "associada ao envio dos dados. Nao foi possivel enviar "
00842                      << "os dados ao IP " << inet_ntoa( ip ) << " e a porta " 
00843                      << ntohs( Port ) << endl;
00844         #endif
00845 
00846         #ifdef RIO_DEBUG1
00847         INTERFACELOG << "[CNetInterface - SendData] Finish2" << endl;
00848         #endif
00849         
00850         return RioStatus;
00851     }                                         
00852     
00853     // Inicializa o cabecalho.
00854     DataHeader.DataType = htons( (uint16_t) DataType );
00855     DataHeader.SourceTransferID = htonl( (uint32_t) ( AuxTransferID ) );
00856     DataHeader.DataTransferID =  htonl( (uint32_t) DestTransferID );
00857     
00858     // Copia os dados em RawData.
00859     memcpy( RawData, &DataHeader, sizeof( DataHeader ) );
00860     memcpy( &RawData[ sizeof( DataHeader ) ], Data, DataSize );
00861     
00862     // Envia os dados para o par IP, Port. Se UseTCP for true, a transferencia
00863     // usara o TCP e, se for false, usara o UDP (por enquanto, usar esta opcao
00864     // deveria gerar um erro.
00865     if( UseTCP )
00866         RioStatus = m_NetTcp->SendData( IP, Port, RawData, RawDataSize, 
00867                                     ( void * ) ( TLTransferID ) AuxTransferID );
00868     else // Descomentar a chamada e remover a linha de atribuicao RioStatus para
00869          // um valor invalido quando o UDP for implementado.                                   
00870         //RioStatus = m_NetUdp->SendData( IP, Port, RawData, RawDataSize, 
00871         //                                ( void * ) AuxTransferID );
00872 
00873     if( FAILED( RioStatus ) )
00874     {
00875         #ifdef RIO_DEBUG2
00876         INTERFACELOG << "CNetInterface::SendData Erro 0x" << hex << RioStatus 
00877                      << dec << " (" << GetErrorDescription( RioStatus ) 
00878                      << ") ao executar a funcao SendData do objeto m_Net ao "
00879                      << "enviar os dados ao destino. Nao foi possivel enviar "
00880                      << "os dados ao IP " << inet_ntoa( ip ) << " e a porta " 
00881                      << ntohs( Port ) << endl;
00882         #endif
00883         
00884         // Devemos chamar a callback?
00885         if( FinalizeCallback != NULL )
00886             FinalizeCallback( FinalizeCallbackParam, ERROR_NETINTERFACE + 
00887                                                      ERROR_SOCKET_SEND );
00888         
00889         // Remove a estrutura da transferencia criada do hash.
00890         RioStatus2 = m_TransferInfo->RemoveTransfer( AuxTransferID );
00891         #ifdef RIO_DEBUG2
00892         if( FAILED( RioStatus2 ) )
00893         {
00894             INTERFACELOG << "CNetInterface::SendData Erro 0x" << hex 
00895                          << RioStatus2 << dec << " (" 
00896                          << GetErrorDescription( RioStatus2 ) << ") ao "
00897                          << "executar a funcao RemoveTransfer do objeto "
00898                          << "m_TransferInfo ao remover a estrutura criada mas "
00899                          << "que nao sera usada!" << endl;
00900         }
00901         #endif
00902 
00903         #ifdef RIO_DEBUG1
00904         INTERFACELOG << "[CNetInterface - SendData] Finish3" << endl;
00905         #endif
00906         
00907         return RioStatus;
00908     }                                         
00909 
00910     #ifdef RIO_DEBUG2
00911     INTERFACELOG << "CNetInterface::SendData enviando os dados do endereco 0x"
00912                  << hex << ( unsigned long ) Data << dec << " com o tamanho de "
00913                  << DataSize << " bytes ao endereco endereco IP " 
00914                  << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) 
00915                  << " com a ID " << AuxTransferID << ". Cabecalho enviado com "
00916                  << "os dados: DataType = 0x" << hex << DataHeader.DataType 
00917                  << ", DataHeader.SourceTransferID = 0x"
00918                  << DataHeader.SourceTransferID 
00919                  << ", DataHeader.DataTransferID = 0x"
00920                  << DataHeader.DataTransferID << ". O endereco do vetor com o "
00921                  << " cabecalho mais os dados e igual a 0x" 
00922                  << ( unsigned long ) RawData <<  dec << ", e serao enviados "
00923                  << "um total de " << RawDataSize << " bytes." << endl;
00924     #endif                      
00925 
00926     // Copia o identificador de transferencia.
00927     if( TransferID != NULL )
00928         *TransferID = AuxTransferID;
00929 
00930     #ifdef RIO_DEBUG1
00931     INTERFACELOG << "[CNetInterface - SendData] Finish4" << endl;
00932     #endif
00933     
00934     return S_OK;
00935 }

void CNetInterface::SendDataCompleted ( int  IP,
int  Port,
void *  Param 
)

Esta Funcao sera chamada pelo objeto de uma das classes de rede (NetTCP ou NetUDP) quando os dados tiverem sido enviados para um endereco (com ou sem sucesso).

Parameters:
IP endereco ip da maquina que enviou os dados.
Port porta a partir da qual o pacote foi enviado a partir da maquina que enviou estes dados
Param parametro passado quando os dados foram enviados. No nosso caso, ele e o identificador da transferencia usada para enviar os dados.

Definition at line 3086 of file NetInterface.cpp.

03087 {
03088     // Armazena o identificador para a estrutura criada para enviar os dados
03089     // ao outro lado (passado como parametro a funcao).
03090     TTransferID TransferID;
03091     // Armazena o resultado da execucao das funcoes do RIO.
03092     RioResult RioStatus;
03093     // Armazena o IP guardado na estrutura da transferencia com o ID TransferID.
03094     int IPTransfer;
03095     // Armazena a porta guardada na estrutura da transferencia com o ID 
03096     // TransferID.
03097     int PortTransfer;
03098     // Armazena a callback de finalizacao associada a transferencia.
03099     callback_t FinalizeCallback;
03100     // Armazena o parametro que deve ser passado quando a callback 
03101     // FinalizeCallback for chamada.
03102     void *FinalizeCallbackParam;
03103     // Armazena a callback de processamento de dados recebidos (somente usada 
03104     // quando mensagens com comandos, do tipo CMDDATA, sao enviadas para o 
03105     // outro lado).
03106     cmdcallback_t ProcessCallback;
03107     // Armazena o parametro que deve ser passado quando a callback 
03108     // ProcessCallbackParam for chamada.
03109     void *ProcessCallbackParam;
03110     // Armazena o ponteiro para os dados que foram enviados (e aqui que vamos
03111     // remover este buffer, apos chamarmos a callback FinalizeCallback).
03112     char *Data;
03113     // Armazena o tamanho em bytes dos dados apontados por Data.
03114     unsigned int DataSize;
03115     // Armazena o tipo da transferencia (se e para envio de dados, o correto 
03116     // para esta chamada ou recebimento de dados, que seria incorreto para 
03117     // esta chamada).
03118     ETransferType TransferType;
03119     // Armazena uma copia do IP para ser usadao pela funcao inet_ntoa do 
03120     // parametro IP e uma copia, tambem para ser usada pela funcao  inet_ntoa,
03121     // do parametro IPTransfer.
03122     in_addr ip, ipt;
03123 
03124     #ifdef RIO_DEBUG1
03125     INTERFACELOG << "[CNetInterface - SendDataCompleted] Start" << endl;
03126     #endif
03127         
03128     // Obtem o ID associado ao envio dos dados.
03129     TransferID = ( TTransferID ) ( TLTransferID ) Param;
03130 
03131     // Inicializa ip com a copia do IP.    
03132     ip.s_addr = IP;
03133 
03134     #ifdef RIO_DEBUG2
03135     INTERFACELOG << "CNetInterface::SendDataCompleted funcao chamada para "
03136                  << "informar que o envio de dados ao IP " << inet_ntoa( ip )
03137                  << " e a porta " << ntohs( Port ) << " foi finalizada com "
03138                  << " sucesso. O envio estava associado a transferencia com "
03139                  << " a ID " << TransferID << "." << endl;
03140     #endif
03141     
03142     RioStatus = m_TransferInfo->GetTransfer( TransferID, &IPTransfer, 
03143                                              &PortTransfer, &FinalizeCallback, 
03144                                              &FinalizeCallbackParam, 
03145                                              &ProcessCallback, 
03146                                              &ProcessCallbackParam, &Data, 
03147                                              &DataSize, &TransferType );
03148     if( FAILED( RioStatus ) )
03149     {
03150         INTERFACELOG << "CNetInterface::SendDataCompleted erro 0x" << hex 
03151                      << RioStatus << dec << " (" 
03152                      << GetErrorDescription( RioStatus ) << ") ao executar a "
03153                      << "funcao GetTransfer. O erro foi gerado para o par IP " 
03154                      << inet_ntoa( ip ) << " e a porta " << ntohs( Port ) << "." 
03155                      << endl;
03156                      
03157         #ifdef RIO_DEBUG1
03158         INTERFACELOG << "[CNetInterface - SendDataCompleted] Finish1" << endl;
03159         #endif
03160 
03161         return;                      
03162     }
03163 
03164     // Inicializa IPTransfer com a copia de IPTransfer;
03165     ipt.s_addr = IPTransfer;
03166     
03167     // Verificamos se o par IP, Porta passado a funcao e o mesmo associado a
03168     // transferencia cujo parametro foi passado como parametro. Note que nao
03169     // precisamos verificar, como na funcao acima, se IPTransfer e PortTransfer
03170     // sao ambos 0 porque todas as funcoes de envio de dados precisam passar o
03171     // par IP, porta destino dos dados.
03172     if( ( IP != IPTransfer ) || ( Port != PortTransfer ) ) 
03173     {
03174         INTERFACELOG << "CNetInterface::SendDataCompleted aviso: o IP " 
03175                      << inet_ntoa( ipt ) << " e a porta " 
03176                      << ntohs( PortTransfer ) << " associados a transferencia "
03177                      << "com o ID " << TransferID << " nao sao iguais ao IP " 
03178                      << inet_ntoa( ip ) << " e a porta " << ntohs( Port )
03179                      << " passados como parametros da funcao." << endl;
03180         
03181         #ifdef RIO_DEBUG1
03182         INTERFACELOG << "[CNetInterface - SendDataCompleted] Finish2" << endl;
03183         #endif
03184         
03185         return;
03186     } 
03187     
03188     if( TransferType != SENDINGDATA ) // Verifica se o tipo de 
03189                                              // transferencia e o adequado.
03190     {
03191         // Transferencia do tipo incorreto. Neste caso, nao podemos chamar a
03192         // callback e nem remover o buffer.
03193         INTERFACELOG << "CNetInterface::SendDataCompleted a transferencia " 
03194                      << "associada ao IP " << inet_ntoa( ipt ) << " e a porta " 
03195                      << ntohs( PortTransfer ) << " nao e do tipo de envio de " 
03196                      << "dados. A callback nao sera chamada e o buffer Data "
03197                      << "nao sera removido!" << endl;
03198 
03199         #ifdef RIO_DEBUG1
03200         INTERFACELOG << "[CNetInterface - SendDataCompleted] Finish3" << endl;
03201         #endif
03202         
03203         return;
03204     }
03205 
03206     // O par IP, Porta da transferencia bate e o tipo de transferencia e de 
03207     // envio. Entao, chamamos a callback e removemos o dado e a transferencia.
03208         
03209     // Chama a callback de finalizacao associada a transferencia, se ela nao
03210     // for nula, ou seja, se um ponteiro para uma callback foi passado quando
03211     // enviamos os dados.
03212     if( FinalizeCallback != NULL )
03213         FinalizeCallback( FinalizeCallbackParam, S_OK );
03214         
03215     // Deleta o buffer com os dados que ja foram enviados com sucesso.
03216     delete[] Data;
03217         
03218     // Remove a estrutura de transferencia da lista com todas as transferencias.
03219     RioStatus = m_TransferInfo->RemoveTransfer( TransferID );
03220     if( FAILED( RioStatus ) )
03221     {
03222         INTERFACELOG << "CNetInterface::SendDataCompleted erro 0x" << hex 
03223                      << RioStatus << dec << " (" 
03224                      << GetErrorDescription( RioStatus ) << ") ao executar a "
03225                      << "funcao RemoveTransfer. O erro foi gerado para o par "
03226                      << "IP " << inet_ntoa( ip ) << " e a porta " 
03227                      << ntohs( Port ) << "." << endl;
03228     }
03229     
03230     #ifdef RIO_DEBUG1
03231     INTERFACELOG << "[CNetInterface - SendDataCompleted] Finish4" << endl;
03232     #endif
03233     
03234     return;
03235 }

void CNetInterface::SendResult ( int  ipadr,
int  port,
TTransferID  TransferID,
int  result 
)

Funcao para enviar uma mensagem do tipo resultado ao endereco ipadr, port destino, passando o resultado dado em result.

Parameters:
ipadr endereco IP para o qual o comando deve ser enviado.
port porta para o qual o comando deve ser enviado.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do resultado a ser enviado.
result resultado a ser passado.

Definition at line 1626 of file NetInterface.cpp.

01628 {
01629     // Armazena o resultado ao executarmos as funcoes do RIO.
01630     RioResult RioStatus;
01631     
01632     #ifdef RIO_DEBUG2
01633     // Usado para armazenar o IP para impressao.
01634     in_addr ip;
01635 
01636     ip.s_addr = ipadr;   
01637     #endif
01638 
01639     #ifdef RIO_DEBUG1
01640     INTERFACELOG << "[CNetInterface - SendResult] Start" << endl;
01641     #endif
01642 
01643     // Tenta criar uma nova mensagem do tipo comando e envia-la ao endereco de
01644     // destino.
01645     RioStatus = SendData( ipadr, port, NULL, NULL, ( char * ) &result, 
01646                           sizeof( int ), RESULTDATA, true, TransferID );
01647     
01648     #ifdef RIO_DEBUG2                      
01649     if( FAILED( RioStatus ) )
01650     {
01651         INTERFACELOG << "CNetInterface::SendResult erro 0x" << hex << RioStatus 
01652                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
01653                      << "ao enviar o resultado " << result << " ao endereco IP " 
01654                      << inet_ntoa( ip ) << " e a porta " << ntohs( port ) << "." 
01655                      << endl;
01656     }               
01657     #endif         
01658 
01659     #ifdef RIO_DEBUG2
01660     INTERFACELOG << "CNetInterface::SendResult enviando o resultado " << result 
01661                  << " ao endereco IP " << inet_ntoa( ip ) << " e a porta " 
01662                  << ntohs( port ) << " para a transferencia com a ID "
01663                  << TransferID << "." << endl;
01664     #endif                      
01665 
01666     #ifdef RIO_DEBUG1
01667     INTERFACELOG << "[CNetInterface - SendResult] Finish" << endl;
01668     #endif
01669 }

void CNetInterface::SendRst ( int  ipadr,
int  port,
TTransferID  TransferID,
int  result 
)

Esta funcao e usada para enviar uma mensagem com um codigo de erro para cancelar um pedido pendende (note que este erro, ao contrario da mensagem enviada por SendResult, indica que um erro ocorreu durante o processamento das IDs de transferencia).

Obs: Por enquanto, isso ocorrera quando, ao cliente solicitar uma busca nos logs do servidor, pedir ou um bloco que um arquivo com os resultados de uma busca cuja identificacao nao existe, ou se pedir um bloco invalido deste arquivo.

Parameters:
ipadr endereco IP para onde deveremos enviar o codigo de erro.
port porta para onde deveremos enviar o codigo de erro.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do resultado a ser enviado.
result codigo de erro a ser enviado.

Definition at line 2659 of file NetInterface.cpp.

02661 {
02662     // Armazena o resultado ao executarmos as funcoes do RIO.
02663     RioResult RioStatus;
02664     
02665     #ifdef RIO_DEBUG2
02666     // Usado para armazenar o IP para impressao.
02667     in_addr ip;
02668 
02669     ip.s_addr = ipadr;   
02670     #endif
02671 
02672     #ifdef RIO_DEBUG1
02673     INTERFACELOG << "[CNetInterface - SendRst] Start" << endl;
02674     #endif
02675 
02676     // Tenta criar uma nova mensagem do tipo comando e envia-la ao endereco de
02677     // destino.
02678     RioStatus = SendData( ipadr, port, NULL, NULL, ( char * ) &result, 
02679                           sizeof( int ), RSTDATA, true, TransferID );
02680     
02681     #ifdef RIO_DEBUG2                      
02682     if( FAILED( RioStatus ) )
02683     {
02684         INTERFACELOG << "CNetInterface::SendRst erro 0x" << hex << RioStatus 
02685                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
02686                      << "ao enviar o erro " << result << " ao endereco IP " 
02687                      << inet_ntoa( ip ) << " e a porta " << ntohs( port ) << "." 
02688                      << endl;
02689     }               
02690 
02691     INTERFACELOG << "CNetInterface::SendRst enviando o resultado " << result 
02692                  << " ao endereco IP " << inet_ntoa( ip ) << " e a porta " 
02693                  << ntohs( port ) << " para a transferencia com a ID "
02694                  << TransferID << "." << endl;
02695     #endif                      
02696 
02697 
02698     #ifdef RIO_DEBUG1
02699     INTERFACELOG << "[CNetInterface - SendRst] Finish" << endl;
02700     #endif
02701 }

void CNetInterface::setLogRotation ( CLogRotation LogRotation  ) 

Funcao para definir o objeto (do tipo CLogRotation) a ser usado para armazenar as estatisticas de envio de pacotes.

Parameters:
LogRotation ponteiro para um objeto do tipo CLogRotation.

Definition at line 2552 of file NetInterface.cpp.

02553 {
02554     #ifdef RIO_DEBUG1
02555     INTERFACELOG << "[CNetInterface - setLogRotation] Start" << endl;
02556     #endif
02557 
02558     if( !m_Started )
02559     {
02560         #ifdef RIO_DEBUG2
02561         INTERFACELOG << "CNetInterface::setLogRotation o objeto nao foi "
02562                      << "inicializado." << endl;
02563         #endif
02564         
02565         #ifdef RIO_DEBUG1
02566         INTERFACELOG << "[CNetInterface - setLogRotation] Finish1" << endl;
02567         #endif
02568         
02569         return;
02570     }
02571 
02572     // Seta a classe de log para o objeto da classe CNetTcp.
02573     m_NetTcp->setLogRotation( LogRotation );
02574     // Seta a classe de log para o objeto da classe CNetUdp.
02575     // Obs: Esta linha esta comentada porque, como a classe CNetUdp nao esta
02576     // implementada, nenhum objeto foi criado para ela. Esta linha devera ser
02577     // descomentada quando a classe CNetUdp for criada porque, em caso 
02578     // contrario, as estatisticas de envio geradas por este objeto poderao nao 
02579     // ser contabilizadas.
02580     //m_NetUdp->setLogRotation( LogRotation );
02581 
02582     #ifdef RIO_DEBUG1
02583     INTERFACELOG << "[CNetInterface - setLogRotation] Finish2" << endl;
02584     #endif
02585 }

RioResult CNetInterface::Start ( int  ServerPort,
time_t  ConnectionTimeOut = 0,
unsigned int  ReceiveTimeOut = 0,
unsigned int  SendTimeOut = 0,
CLogRotation LogRotation = NULL 
)

Funcao usada para inicializar a classe usada pelo servidor ou o storage.

Parameters:
ServerPort porta TCP a qual devemos no conectar (este parametro somente e usado pelos servidores).
ConnectionTimeOut timeout (em segundos) para uma conexao entre o cliente e um dos servidores (usado somente pelas conexoes TCP).
ReceiveTimeOut timeout (em milisegundos) para os comandos de recebimento de dados (recv).
SendTimeOut timeout (em milisegunfod) para os comandos de envio de dados (send).
LogRotation ponteiro para o objeto que gerencia o armazenamento dos logs de envio de dados pelo servidor (de armazenamento).
isStorage usado para indicar se o objeto esta associado a um servidor de despacho (false) ou a um servidor de armazenamento (true). Esta parametro somente e usado com o parametro LogPath para podermos criar um nome diferenciado para o servidor de despacho e para o servidor de armazenamento.
LogPath caminho do arquivo usado para armazenar os logs dos envio de dados. Se usarmos o parametro default NULL, as impressoes serao colocadas na RioErr. Em caso contrario, o nome do do arquivo sera gerado segundo o seguinte criterio: RIOServerEmul_<maquina>.<dominio>.log se o servidor de despacho executou a funcao. RIOStorageEmul_<maquina>.<dominio>.log se o servidor de armazenamento executou a funcao.

Obs: Este parametro, assim como na classe NetMgr e RioNeti, somente estara disponivel se a constante RIO_DEBUG_FILE for usada.

Returns:
S_OK se nenhum erro ocorreu ao inicializar a classe, ou o erro em caso contrario. Obs2: Devido a ser usado para criar um nome para o log, o parametro isStorage tambem somente e usado quando a constante RIO_DEBUG_FILE for usada.

Definition at line 1132 of file NetInterface.cpp.

01137 {
01138     // Armazena o codigo de erro do RIO retornado pelas funcoes.
01139     RioResult RioStatus; 
01140     // Estrutura para armazenar as informacoes do objeto da classe CNetTcp
01141     SNetTcpConfig NetTcpConfig;
01142     // Estrutura para armazenar as informacoes do objeto da classe CNetUdp
01143     SNetUdpConfig NetUdpConfig;
01144 
01145     // Usado para compor o nome do arquivo se LogPath for NULL (somente quando
01146     // RIO_DEBUG_FILE for usado).
01147     #ifdef RIO_DEBUG_FILE
01148     string file;
01149     // Armazena o nome do arquivo do log.
01150     const char *LogFileName;
01151     #endif
01152 
01153     #ifdef RIO_DEBUG1
01154     RioErr << "[CNetInterface - Start] - Start" << endl;
01155     #endif
01156     
01157     // Verifica se o objeto ja foi inicializado.
01158     if( m_Started )
01159     {
01160         #ifdef RIO_DEBUG2
01161         RioErr << "CNetInterface::Start o objeto ja foi inicializado." 
01162                << endl;
01163         #endif
01164 
01165         #ifdef RIO_DEBUG1
01166         RioErr << "[CNetInterface - Start] Finish1" << endl;
01167         #endif
01168         
01169         return ERROR_NETINTERFACE + ERROR_STARTED;
01170     }
01171     
01172     // Inicializa o objeto da classe para geracao de logs
01173     #ifdef RIO_DEBUG_FILE
01174     if( LogPath == NULL )
01175     {
01176         char tmpName[256];
01177         char tmpDomain[256];
01178         gethostname( tmpName, 255 );
01179         getdomainname( tmpDomain, 255 );
01180         string file;
01181 
01182         if( isStorage )
01183             file = "RIOStorageEmul_";
01184         else 
01185             file = "RIOServerEmul_";
01186 
01187         file += tmpName;
01188         if( strstr( tmpName, tmpDomain ) == NULL ) 
01189         {
01190             file += ".";
01191             file += tmpDomain;
01192         }
01193         file += ".log";
01194     
01195         LogFileName = file.c_str();
01196     }
01197     else
01198         LogFileName = LogPath;
01199     #endif
01200 
01201     // Inicializa todos os campos da estrutura.
01202     memset( &NetTcpConfig, 0, sizeof( NetTcpConfig ) );
01203     // Inicializa os campos da estrutura NetConfig usados pelo servidor para a
01204     // conexao TCP.
01205     NetTcpConfig.isServer = true;
01206     NetTcpConfig.ReceiveTimeOut = ReceiveTimeOut;
01207     NetTcpConfig.SendTimeOut = SendTimeOut;
01208     NetTcpConfig.ConnectionTimeOut = ConnectionTimeOut;
01209     NetTcpConfig.ServerPort = ServerPort;
01210     NetTcpConfig.LogRotation = LogRotation;
01211     #ifdef RIO_DEBUG_FILE
01212     // Inicializa as informacoes de depuracao.
01213     NetTcpConfig.LogFileName = LogFileName;
01214     #endif 
01215     // Usa a funcao FindIP para obter um IP para a conexao do servidor ou 
01216     // storage.
01217     RioStatus = FindIP( &NetTcpConfig.HostIP );
01218     if ( FAILED( RioStatus ) )
01219     {
01220         #ifdef RIO_DEBUG2
01221         RioErr << "CNetInterface::Start erro ao executar FindIP." << endl;
01222         #endif
01223 
01224         #ifdef RIO_DEBUG1
01225         RioErr << "[CNetInterface - Start] Finish2" << endl;
01226         #endif
01227 
01228         return RioStatus;        
01229     }
01230     
01231     // Tenta criar e inicializar um novo objeto da classe CTransferInfo.
01232     RioStatus = StartTransferInfo();
01233     if( FAILED( RioStatus ) )
01234     {
01235         #ifdef RIO_DEBUG2
01236         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01237                << " (" << GetErrorDescription( RioStatus ) 
01238                << ") ao executar a funcao StartTransferInfo" << endl;
01239         #endif
01240  
01241         #ifdef RIO_DEBUG1
01242         RioErr << "[CNetInterface - Start] Finish3" << endl;
01243         #endif
01244             
01245         return RioStatus;
01246     }
01247 
01248     // Tenta inicializar o objeto da classe CNetTcp para o envio de dados em
01249     // tempo nao real.
01250     RioStatus = StartNetTcp( &NetTcpConfig );
01251     if( FAILED( RioStatus ) )
01252     {
01253         #ifdef RIO_DEBUG2
01254         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01255                << " (" << GetErrorDescription( RioStatus ) 
01256                << ") ao executar a funcao StartNet" << endl;
01257         #endif
01258  
01259         #ifdef RIO_DEBUG1
01260         RioErr << "[CNetInterface - Start] Finish4" << endl;
01261         #endif
01262             
01263         return RioStatus;
01264     }
01265 
01266     // Inicializa os campos da estrutura NetConfig usados pelo cliente para a
01267     // conexao UDP.
01268     NetUdpConfig.isServer = true;
01269     NetUdpConfig.LogRotation = LogRotation;
01270     NetUdpConfig.HostIP = NetTcpConfig.HostIP;
01271     #ifdef RIO_DEBUG_FILE
01272     NetUdpConfig.LogFileName = LogFileName;
01273     #endif
01274     
01275     // Tenta inicializar o objeto da classe CNetUdp para o envio de dados em
01276     // tempo real.
01277     RioStatus = StartNetUdp( &NetUdpConfig );
01278     if( FAILED( RioStatus ) )
01279     {
01280         #ifdef RIO_DEBUG2
01281         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01282                << " (" << GetErrorDescription( RioStatus ) 
01283                << ") ao executar a funcao StartNetUdp" << endl;
01284         #endif
01285  
01286         #ifdef RIO_DEBUG1
01287         RioErr << "[CNetInterface - Start] Finish5" << endl;
01288         #endif
01289             
01290         return RioStatus;
01291     }
01292 
01293     // Informa que a classe foi corretamente inicializada.
01294     m_Started = true;
01295 
01296     #ifdef RIO_DEBUG2
01297     RioErr << "CNetInterface::Start objeto criado e inicializado com sucesso!" 
01298            << endl;
01299     #endif
01300 
01301     #ifdef RIO_DEBUG1
01302     RioErr << "[CNetInterface - Start] Finish6" << endl;
01303     #endif
01304     
01305     return S_OK;    
01306 }

RioResult CNetInterface::Start ( struct sockaddr_in *  ServerAddress,
unsigned int  ServerAddressSize,
time_t  ConnectionTimeOut = 0,
unsigned int  ReceiveTimeOut = 0,
unsigned int  SendTimeOut = 0 
)

Funcao usada para inicializar a classe usada pelo cliente.

Parameters:
ServerAddress vetor de estruturas (do tipo sockaddr_in) com os enderecos (IP, porta) dos servidores com os quais o cliente deve criar uma conexao (este parametro e ignorado para as conexoes UDP, ou seja, se UseTcp for igual a false).
ServerAddressSize numero de enderecos no vetor ServerAddress.
ConnectionTimeOut timeout (em segundos) para uma conexao entre o cliente e um dos servidores (usado somente pelas conexoes TCP).
ReceiveTimeOut timeout (em milisegundos) para os comandos de recebimento de dados (recv).
SendTimeOut timeout (em milisegunfod) para os comandos de envio de dados (send).
LogPath caminho do arquivo usado para armazenar os logs dos envio de dados. Se usarmos o parametro default NULL, as impressoes serao colocadas na RioErr. Em caso contrario, o nome do do arquivo sera RIOClientEmul_<maquina>.<dominio>.log. Este parametro, assim como na classe NetMgr e RioNeti, somente estara disponivel se a constante RIO_DEBUG_FILE for usada.
Returns:
S_OK se nenhum erro ocorreu ao inicializar a classe, ou o erro em caso contrario.

Definition at line 945 of file NetInterface.cpp.

00951 {
00952     // Armazena o codigo de erro do RIO retornado pelas funcoes.
00953     RioResult RioStatus; 
00954     // Estrutura para armazenar as informacoes do objeto da classe CNetTcp
00955     SNetTcpConfig NetTcpConfig;
00956     // Estrutura para armazenar as informacoes do objeto da classe CNetUdp
00957     SNetUdpConfig NetUdpConfig;
00958 
00959     // Usado para compor o nome do arquivo se LogPath for NULL (somente quando
00960     // RIO_DEBUG_FILE for usado).
00961     #ifdef RIO_DEBUG_FILE
00962     string file;
00963     // Armazena o nome do arquivo do log.
00964     const char *LogFileName;
00965     #endif
00966     
00967 
00968     #ifdef RIO_DEBUG1
00969     RioErr << "[CNetInterface - Start] Start" << endl;
00970     #endif
00971 
00972     // Verifica se o objeto ja foi inicializado.
00973     if( m_Started )
00974     {
00975         #ifdef RIO_DEBUG2
00976         RioErr << "CNetInterface::Start o objeto ja foi inicializado." 
00977                << endl;
00978         #endif
00979 
00980         #ifdef RIO_DEBUG1
00981         RioErr << "[CNetInterface - Start] Finish1" << endl;
00982         #endif
00983         
00984         return ERROR_NETINTERFACE + ERROR_STARTED;
00985     }
00986     
00987     // Inicializa o objeto da classe para geracao de logs
00988     #ifdef RIO_DEBUG_FILE
00989     if( LogPath == NULL )
00990     {
00991         char tmpName[256];
00992         char tmpDomain[256];
00993         gethostname( tmpName, 255 );
00994         getdomainname( tmpDomain, 255 );
00995         char tmpPid[ 20 ]; // Tamanho de um inteiro de 64 bits (caso o rio
00996                            // rio seja compilado em uma maquina cujo int
00997                            // e de 64 bits).
00998         pid_t myPid;
00999         myPid = getpid();
01000         sprintf( tmpPid, "%d", ( int ) myPid );                     
01001         file = "RIOClientEmul_";
01002         file += tmpPid;
01003         file += "_";
01004         file += tmpName;
01005 
01006         if( strstr( tmpName, tmpDomain ) == NULL ) 
01007         {
01008             file += ".";
01009             file += tmpDomain;
01010         }
01011         file += ".log";
01012     
01013         LogFileName = file.c_str();
01014     }
01015     else
01016         LogFileName = LogPath;
01017     #endif
01018 
01019     // Inicializa todos os campos da estrutura.
01020     memset( &NetTcpConfig, 0, sizeof( NetTcpConfig ) );
01021     // Inicializa os campos da estrutura NetConfig usados pelo cliente para a
01022     // conexao TCP.
01023     NetTcpConfig.isServer = false;
01024     NetTcpConfig.ReceiveTimeOut = ReceiveTimeOut;
01025     NetTcpConfig.SendTimeOut = SendTimeOut;
01026     NetTcpConfig.ConnectionTimeOut = ConnectionTimeOut;
01027     NetTcpConfig.ServerAddress = ServerAddress;
01028     NetTcpConfig.ServerAddressSize = ServerAddressSize;
01029     #ifdef RIO_DEBUG_FILE
01030     NetTcpConfig.LogFileName = LogFileName;
01031     #endif
01032 
01033     // Usa a funcao FindIP para obter um IP para a conexao do cliente.
01034     RioStatus = FindIP( &NetTcpConfig.HostIP );
01035     if ( FAILED( RioStatus ) )
01036     {
01037         #ifdef RIO_DEBUG2
01038         RioErr << "CNetInterface::Start erro ao executar FindIP." << endl;
01039         #endif
01040 
01041         #ifdef RIO_DEBUG1
01042         RioErr << "[CNetInterface - Start] Finish2" << endl;
01043         #endif
01044 
01045         return RioStatus;
01046     }
01047 
01048     // Tenta criar e inicializar um novo objeto da classe CTransferInfo.
01049     RioStatus = StartTransferInfo();
01050     if( FAILED( RioStatus ) )
01051     {
01052         #ifdef RIO_DEBUG2
01053         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01054                << " (" << GetErrorDescription( RioStatus ) 
01055                << ") ao executar a funcao StartTransferInfo" << endl;
01056         #endif
01057  
01058         #ifdef RIO_DEBUG1
01059         RioErr << "[CNetInterface - Start] Finish3" << endl;
01060         #endif
01061             
01062         return RioStatus;
01063     }
01064     
01065     // Tenta inicializar o objeto da classe CNetTcp para o envio de dados em
01066     // tempo nao real.
01067     RioStatus = StartNetTcp( &NetTcpConfig );
01068     if( FAILED( RioStatus ) )
01069     {
01070         #ifdef RIO_DEBUG2
01071         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01072                << " (" << GetErrorDescription( RioStatus ) 
01073                << ") ao executar a funcao StartNetTcp" << endl;
01074         #endif
01075  
01076         #ifdef RIO_DEBUG1
01077         RioErr << "[CNetInterface - Start] Finish4" << endl;
01078         #endif
01079             
01080         return RioStatus;
01081     }
01082 
01083     // Inicializa os campos da estrutura NetConfig usados pelo cliente para a
01084     // conexao UDP.
01085     NetUdpConfig.isServer = false;
01086     NetUdpConfig.HostIP = NetTcpConfig.HostIP;
01087     #ifdef RIO_DEBUG_FILE
01088     NetUdpConfig.LogFileName = LogFileName;
01089     #endif
01090     
01091     // Tenta inicializar o objeto da classe CNetUdp para o envio de dados em
01092     // tempo real.
01093     RioStatus = StartNetUdp( &NetUdpConfig );
01094     if( FAILED( RioStatus ) )
01095     {
01096         #ifdef RIO_DEBUG2
01097         RioErr << "CNetInterface::Start erro 0x" << hex << RioStatus << dec 
01098                << " (" << GetErrorDescription( RioStatus ) 
01099                << ") ao executar a funcao StartNetUdp" << endl;
01100         #endif
01101  
01102         #ifdef RIO_DEBUG1
01103         RioErr << "[CNetInterface - Start] Finish5" << endl;
01104         #endif
01105             
01106         return RioStatus;
01107     }
01108     
01109     // Informa que a classe foi corretamente inicializada.
01110     m_Started = true;
01111 
01112     #ifdef RIO_DEBUG2
01113     RioErr << "CNetInterface::Start objeto criado e inicializado com sucesso!" 
01114            << endl;
01115     #endif
01116 
01117     #ifdef RIO_DEBUG1
01118     RioErr << "[CNetInterface - Start] Finish6" << endl;
01119     #endif
01120     
01121     return S_OK;    
01122 }

RioResult CNetInterface::StartNetTcp ( SNetTcpConfig NetConfig  )  [private]

Funcao usada para criar e inicializar o objeto derivado da classe classes CNetTcp.

Parameters:
NetConfig estrutura com as configuracoes do objeto a ser criado da classe CNetTcp.
Returns:
S_OK se a criacao e inicializao do objeto foi feita com sucesso ou false se algum erro ocorreu.

Definition at line 644 of file NetInterface.cpp.

00645 {
00646     // Armazena o codigo de erro do RIO retornado pelas funcoes.
00647     RioResult RioStatus; 
00648 
00649     #ifdef RIO_DEBUG1
00650     INTERFACELOG << "[CNetInterface::StartNetTcp] Start" << endl;
00651     #endif
00652     
00653     // Devemos criar um objeto para transferencias via TCP.
00654     m_NetTcp = new CNetTcp( this );
00655     if( m_NetTcp == NULL )
00656     {
00657         #ifdef RIO_DEBUG2
00658         INTERFACELOG << "CNetInterface::StartNetTcp erro de alocacao de "
00659                      << "memoria ao criar o objeto da classe CNetTcp." << endl;
00660         #endif
00661 
00662         #ifdef RIO_DEBUG1
00663         INTERFACELOG  << "[CNetInterface - StartNetTcp] Finish1" << endl;
00664         #endif
00665             
00666         return ERROR_NETINTERFACE + ERROR_MEMORY;
00667     }
00668         
00669     // Tenta inicializar a classe.
00670     RioStatus = m_NetTcp->Start( NetConfig );
00671     if( FAILED( RioStatus ) )
00672     {
00673         #ifdef RIO_DEBUG2
00674         INTERFACELOG << "CNetInterface::StartNetTcp erro 0x" << hex << RioStatus
00675                      << dec << " (" << GetErrorDescription( RioStatus ) << ") "
00676                      << "ao executar a funcao Start do objeto da classe "
00677                      << "CNetTcp." << endl;
00678         #endif
00679  
00680         delete m_NetTcp;
00681         m_NetTcp = NULL;
00682 
00683         #ifdef RIO_DEBUG1
00684         INTERFACELOG << "[CNetInterface - StartNetTcp ] Finish2" << endl;
00685         #endif
00686             
00687         return RioStatus;
00688     } 
00689 
00690     #ifdef RIO_DEBUG2
00691     INTERFACELOG << "CNetInterface::StartNetTcp objeto criado e inicializado!" 
00692                  << endl;
00693     #endif
00694 
00695     #ifdef RIO_DEBUG1
00696     INTERFACELOG << "[CNetInterface - StartNetTcp] Finish3" << endl;
00697     #endif
00698     
00699     return S_OK;
00700 }

RioResult CNetInterface::StartNetUdp ( SNetUdpConfig NetConfig  )  [private]

Funcao usada para criar e inicializar o objeto derivado da classe classes CNetUdp.

Parameters:
NetConfig estrutura com as configuracoes do objeto a ser criado da classe CNetUdp.
Returns:
S_OK se a criacao e inicializao do objeto foi feita com sucesso ou false se algum erro ocorreu.

Definition at line 704 of file NetInterface.cpp.

00705 {
00706     #ifdef RIO_DEBUG1
00707     INTERFACELOG << "[CNetInterface::StartNetUdp] Start" << endl;
00708     #endif
00709     
00710     // Depois que a classe UDP for implementada, deveremos fazer as 
00711     // inicializacoes (provavelmente sera igual a da classe TCP acima).
00712     m_NetUdp = NULL;
00713 
00714     #ifdef RIO_DEBUG2
00715     INTERFACELOG << "CNetInterface::StartNetUdp objeto criado e inicializado!" 
00716                  << endl;
00717     #endif
00718 
00719     #ifdef RIO_DEBUG1
00720     INTERFACELOG << "[CNetInterface::StartNetUdp] Finish" << endl;
00721     #endif
00722     
00723     return S_OK;
00724 }

RioResult CNetInterface::StartTransferInfo (  )  [private]

Funcao usada para criar um novo objeto da classe CTransferInfo.

Returns:
S_OK se a criacao e inicializao do objeto foi feita com sucesso ou false se algum erro ocorreu.

Definition at line 727 of file NetInterface.cpp.

00728 {
00729     #ifdef RIO_DEBUG1
00730     INTERFACELOG << "[CNetInterface - StartTransferInfo] Start" << endl;
00731     #endif
00732     
00733     try
00734     {
00735         m_TransferInfo = new CTransferInfo( this );
00736     }
00737     catch( bad_alloc &ba )
00738     {
00739         #ifdef RIO_DEBUG2
00740         INTERFACELOG << "CNetInterface::StartTransferInfo Erro de alocacao de "
00741                      << "memoria (bad_alloc, error = " << ba.what() << ") ao "
00742                      << "criar o objeto do tipo CTransferInfo para gerenciar "
00743                      << "as transferencias." << endl;
00744         #endif
00745 
00746         #ifdef RIO_DEBUG1
00747         INTERFACELOG << "[CNetInterface - SendData] Finish1" << endl;
00748         #endif
00749         
00750         return ERROR_NETINTERFACE + ERROR_MEMORY;
00751     }
00752     
00753     #ifdef RIO_DEBUG2
00754     INTERFACELOG << "CNetInterface::StartTransferInfo objeto criado e "
00755                  << "inicializado!" << endl;
00756     #endif
00757 
00758     #ifdef RIO_DEBUG1
00759     INTERFACELOG << "[CNetInterface - StartTransferInfo] Finish2" << endl;
00760     #endif
00761     
00762     return S_OK;
00763 }

RioResult CNetInterface::Stop ( void   ) 

Funcao para parar o funcionamento do objeto da classe, parando todas as threads que tenham sido criadas por um objeto de uma das classes derivadas da CNet e tambem todas as estruturas alocadas.

Returns:
S_OK se nenhum erro ocorreu ao parar a classe, ou o codigo do erro em caso contrario.

Definition at line 1311 of file NetInterface.cpp.

01312 {
01313     // Armazena o codigo de erro do RIO retornado pelas funcoes.
01314     RioResult RioStatus; 
01315 
01316     #ifdef RIO_DEBUG1
01317     INTERFACELOG << "[CNetInterface - Stop] Start" << endl;
01318     #endif
01319     
01320     if( !m_Started )
01321     {
01322         #ifdef RIO_DEBUG2
01323         INTERFACELOG << "CNetInterface::Stop o objeto nao foi inicializado."
01324                      << endl;
01325         #endif
01326 
01327         #ifdef RIO_DEBUG1
01328         INTERFACELOG << "[CNetInterface - Stop] Finish1" << endl;
01329         #endif
01330         
01331         return ERROR_NETTCP + ERROR_NOT_STARTED;
01332     }
01333     
01334     // Para o objeto da classe de transferencia de dados TCP.
01335     RioStatus = m_NetTcp->Stop();
01336     if( FAILED( RioStatus ) )
01337     {
01338         #ifdef RIO_DEBUG2
01339         INTERFACELOG << "CNetInterface::Stop erro 0x" << hex << RioStatus << dec 
01340                      << " (" << GetErrorDescription( RioStatus ) 
01341                      << ") ao executar a funcao Stop do objeto da classe "
01342                      << "CNetTcp" << endl;
01343         #endif
01344  
01345         #ifdef RIO_DEBUG1
01346         INTERFACELOG << "[CNetInterface - Stop] Finish2" << endl;
01347         #endif
01348             
01349         return RioStatus;
01350     }
01351 
01352     // Obs: Quando a classe UDP for implementada, deveremos tambem executar aqui 
01353     // a funcao Stop desta classe. O codigo esta comentado e e dado a seguir.
01354     // Note que o ultimo comentario devera passar a ser 
01355     // "[CNetInterface - Stop] Finish4".
01356     // Para o objeto da classe de transferencia de dados UDP.
01357     //RioStatus = m_NetUdp->Stop();
01358     //if( FAILED( RioStatus ) )
01359     //{
01360     //    #ifdef RIO_DEBUG2
01361     //    INTERFACELOG << "CNetInterface::Stop erro 0x" << hex << RioStatus << dec 
01362     //                 << " (" << GetErrorDescription( RioStatus ) 
01363     //                 << ") ao executar a funcao Stop do objeto da classe "
01364     //                 << "CNetUdp" << endl;
01365     //    #endif
01366     //
01367     //    #ifdef RIO_DEBUG1
01368     //    INTERFACELOG << "[CNetInterface - Stop] Finish3" << endl;
01369     //    #endif
01370     //        
01371     //    return RioStatus;
01372     //}
01373 
01374     // Destroi o objeto responsavel pelo gerenciamento das transmissoes
01375     if( m_TransferInfo != NULL )
01376        delete m_TransferInfo;
01377     
01378     // Destroi o objeto responsavel pelas transmissoes de dados via TCP.
01379     if( m_NetTcp != NULL )
01380         delete m_NetTcp;
01381 
01382     // Destroi o objeto responsavel pelas transmissoes de dados via UDP.
01383     //
01384     // Obs: Esta linha nao esta comentada porque verificamos se m_NetUdp e
01385     // NULL.
01386     if( m_NetUdp != NULL )
01387         delete m_NetUdp;
01388         
01389     // Indica que a classe nao esta mais inicializada!
01390     m_Started = false;
01391     
01392     // Obtem o acesso exclusivo ao mapa com as transferencias pendendes.
01393     //pthread_mutex_lock( &m_MapMutex );
01394 
01395     // Libera o acesso exclusivo ao mapa com as transferencias pendendes.
01396     //pthread_mutex_unlock( &m_MapMutex );
01397     
01398     #ifdef RIO_DEBUG2
01399     RioErr << "CNetInterface::Stop objeto finalizado com sucesso!" << endl;
01400     #endif
01401 
01402     #ifdef RIO_DEBUG1
01403     INTERFACELOG << "[CNetInterface - Stop] Finish3" << endl;
01404     #endif
01405     
01406     return S_OK;
01407 }

void CNetInterface::TellId ( int  ipadr,
int  port,
TTransferID  TransferID,
int  tellip,
int  tellport,
TTransferID  tellTTransferID,
callback_t  callback,
void *  callbackparm 
)

Envia ao outro lado da conexao, usando um comando, as informacoes necessarias para que este lado envie um bloco.

Parameters:
ipadr endereco IP para onde a ID deve ser enviada.
port porta neste endereco para onde a ID deve ser enviada.
TransferID identificador da estrutura de transferencia no endereco destino associada ao recebimento do comando com a ID que devera ser processado.
tellip endereco IP (local?) informando, ao outro lado, para onde o bloco deve ser enviado quando o comando com a ID for recebido.
tellport porta (local?) informando, ao outro lado, para onde o bloco deve ser enviado quando o comando com a ID for recebido.
tellTransferID identificador da estrutura de transferencia (local) assiada ao bloco a ser recebido pelo outro lado depois de a ID ser processada.
callback callback a ser chamada quando o processamento do comando que envia as informacoes terminar.
callbackparm parametro a ser passado quando a callback for chamada.

Definition at line 1880 of file NetInterface.cpp.

01884 {
01885     // Vetor para criar o comando a ser enviado pela rede.
01886     u32 TellIdCmd[ CMD_TELLID_SIZE ];
01887 
01888     #ifdef RIO_DEBUG2
01889     // Usado para armazenar o IP para impressao.
01890     in_addr ip, ipt;
01891 
01892     ip.s_addr = ipadr;
01893     ipt.s_addr = tellip;   
01894     #endif
01895 
01896     #ifdef RIO_DEBUG1
01897     INTERFACELOG << "[CNetInterface - TellId] Start" << endl;
01898     #endif
01899     
01900     // Inicializa os campos do comando.
01901     //
01902     // Obs: precisamos avaliar se o comando tera a mesma estrutura, ou seja,
01903     // se sera ou nao necessario a deteccao de duplicatas do comando que
01904     // eventualmente possam ter sido enviadas. 
01905     //
01906     TellIdCmd[ 0 ] = htonl( CMD_TELLID );
01907     TellIdCmd[ 1 ] = tellip;
01908     TellIdCmd[ 2 ] = htonl( ntohs( ( short ) tellport ) );
01909     TellIdCmd[ 3 ] = htonl( tellTTransferID ); 
01910     
01911     // Envia o comando usando a funcao SendCmd.
01912     SendCmd( ipadr, port, TransferID, ( char * ) TellIdCmd, CMD_TELLID_BYTESIZE, 
01913              callback, callbackparm );                                   
01914 
01915     #ifdef RIO_DEBUG2
01916     INTERFACELOG << "CNetInterface::TellId Informando a ID " << tellTTransferID
01917                  << " associada ao endereco IP " << inet_ntoa( ipt ) << " e a "
01918                  << "porta " << ntohs( tellport ) << " ao endereco IP " 
01919                  << inet_ntoa( ip ) << " e a porta " << ntohs( port ) 
01920                  << " usando a ID " << TransferID << "." << endl;
01921     #endif                      
01922 
01923     #ifdef RIO_DEBUG1
01924     INTERFACELOG << "[CNetInterface - TellId] Finish" << endl;
01925     #endif
01926 }

bool CNetInterface::thereAreFragments ( RioBlock  block  ) 

Funcao para verificar se fragmentos foram recebidos para o bloco passado como parametro.

Obs: Como ainda nao implementamos a classe CNetUdp, que sera a responsavel pela copia em tempo real, esta funcao ira retornar false se for chamada, e imprimira um erro se RIO_DEBUG2 estiver sendo usado.

Parameters:
block bloco para o qual desejamos ver se existem fragmentos.
Returns:
true se frgamentos ja foram recebidos para o bloco ou false se nenhum fragmento foi recebido para o bloco.

Definition at line 2506 of file NetInterface.cpp.

02507 {
02508     #ifdef RIO_DEBUG1
02509     INTERFACELOG << "[CNetInterface - thereAreFragments] Start" << endl;
02510     #endif
02511     
02512     #ifdef RIO_DEBUG2
02513     INTERFACELOG << "[CNetInterface::thereAreFragments] Esta funcao nao esta "
02514                  << "implementada! Retornado o valor false!" << endl;
02515     #endif
02516     
02517     #ifdef RIO_DEBUG1
02518     INTERFACELOG << "[CNetInterface - thereAreFragments] Finish" << endl;
02519     #endif
02520     
02521     return false;
02522 }


Friends And Related Function Documentation

friend class CTransferInfo [friend]

Definition at line 1037 of file NetInterface.h.


Field Documentation

Definition at line 494 of file NetInterface.h.

pthread_mutex_t CNetInterface::m_MapMutex [private]

Definition at line 372 of file NetInterface.h.

Definition at line 364 of file NetInterface.h.

Definition at line 367 of file NetInterface.h.

bool CNetInterface::m_Started [private]

Definition at line 361 of file NetInterface.h.

Definition at line 370 of file NetInterface.h.


The documentation for this class was generated from the following files:
Generated on Wed Jul 4 16:03:31 2012 for RIO by  doxygen 1.6.3