sft_ok.c

Go to the documentation of this file.
00001 
00021 #include <sys/types.h>
00022 #include <sys/socket.h>
00023 #include <sys/stat.h>
00024 #include <sys/types.h>
00025 #include <dirent.h>     //para abrir diretorios.
00026 #include <unistd.h>
00027 #include <netinet/in.h>
00028 #include <netdb.h>
00029 #include <stdio.h>
00030 #include <string.h>
00031 #include <stdlib.h>
00032 #include <unistd.h> //para comando de usleep
00033 #include <ctype.h>
00034 
00035 
00036 #define TAMMSG 1100
00037 #define SFT_PORT 45
00038 #define SFTD_BUFFER_DATA 1000
00039 
00040 int s1, i, gif;
00041 struct sockaddr_in server;
00042 struct hostent *hp, *gethostbyname();
00043 int id_stc; //id do pacote atual que esta sendo processado.
00044 
00045 char msg_rec[TAMMSG];
00046 char msg_send[TAMMSG];
00047 char buff[TAMMSG];
00048 struct sft_hdr *sft;
00049 
00054 typedef enum {
00055         CMD_SEND =0,
00056         CMD_SEND_WAIT,
00057         CMD_STOP,
00058         CMD_SEND_SEQ,
00059         CMD_FINISHED,
00060         CMD_SEND_X,
00061         CMD_SENDU,
00062         CMD_ERROR
00063 } cmd_sft;
00064 
00068 struct sft_hdr{
00069         char cmd[2];
00070         char len[4];
00071         char mf;
00072         char nro_pkt[2];
00073         char buff_send[SFTD_BUFFER_DATA];
00074 
00075 };
00076 
00077 //declaração ;-)
00078 int main(int argc, char *argv[]);
00079 int sft_send_x(char* data);
00080 int sft_sendu(char* data);
00081 int sft_send_seq(char * data);
00082 int sft_send_loop(char * data);
00083 
00084 
00090 int send_pkt(void){
00091         int rval;
00092         struct sft_hdr *rec;
00093         char id[3];
00094 //      char sftptr[1500];
00095 
00096         //envia sctruct.
00097 //      printf("CMD %s\t", sft->cmd);
00098 //      printf("LEN %s\t", sft->len);
00099 //      printf("MF %c\t", sft->mf);
00100 //      printf("ID %s\t", sft->id);
00101 //      printf("NR_PKT %s\n", sft->nro_pkt);
00102 
00103         send(s1, (struct sft_hdr *)sft, sizeof(struct sft_hdr), 0);
00104 
00105         //limpa struct para novo pacote.
00106         bzero((struct sft_hdr *)sft, sizeof(struct sft_hdr));
00107 
00108         //espera resposta..
00109         rval = recv(s1, msg_rec, TAMMSG, 0) ;
00110 
00111         //carrega resposta no vetor de dados sft.
00112         rec = (struct sft_hdr *)msg_rec;
00113 
00114         sprintf(id, "%03d", id_stc);
00115         //printf("Meu ID: %s  \t ID do Pkt %s", id,rec->id);
00116         fflush(stdout);
00117         //if (strncmp(rec->id, id,3)!=0) return CMD_ERROR;      //não é o ID do pacote que foi enviado.
00118         if (!strncmp(rec->cmd, "01",2)) return CMD_SEND_WAIT;
00119         if (!strncmp(rec->cmd, "02",2)) return CMD_STOP;
00120 
00121         return -1;      //não retorna estado valido.
00122 }
00123 
00131 int sft_send(char* data){
00132         FILE *fp;
00133         long fp_tam=0;
00134         size_t result;
00135         char* aux='\0';
00136         char* fp_buff='\0';
00137         int i=0, vlr[30000], qt_pkt=0, j=0,l=0,m=0, resp=0;
00138         struct sft_hdr s;
00139 
00140         //obtem os dados do arquivo, grava tudo em fp_buff.
00141         data = strtok(data, "\n");
00142         fp = fopen(data, "r");
00143         if(fp == NULL){
00144                 printf("\nArquivo solicitado não existe na raiz deste diretorio.");
00145                 return -1;
00146         }
00147 
00148         // obtain file size:
00149         fseek (fp , 0 , SEEK_END);
00150         fp_tam = ftell (fp);
00151         rewind (fp);
00152 
00153         // allocate memory to contain the whole file:
00154         fp_buff = (char*) malloc (sizeof(char)*fp_tam);
00155         if (fp_buff == NULL) {fputs ("Memory error",stderr); return -1;}
00156 
00157         // copy the file into the buffer:
00158         result = fread (fp_buff,1,fp_tam,fp);
00159         if (result != fp_tam) {fputs ("Reading error",stderr); return -1;}
00160         // terminate
00161         fclose (fp);
00162 
00163         //fp_buff contem o arquivo para ser tratado.
00164         aux = strtok(fp_buff, " ,\"\\");
00165         //printf("\n> %s", aux);
00166         i=0;
00167         sscanf(aux, "0x%x", &vlr[i]);
00168         while(1){
00169                 i++;
00170                 aux = strtok(NULL, "\\ \",\n");
00171                 if(aux==NULL) break;    //acabou a figura
00172                 //printf("\n> %s", aux);
00173                 sscanf(aux, "0x%x", &vlr[i]);
00174                 //printf(" -  %d\t%d", vlr[i], i);
00175                 fflush(stdout);
00176         }
00177 
00178         free (fp_buff); //--gdb   (excutar programa) --------------------------------- TLDP.org (tutoriais)
00179 
00180 
00181         //vlr é um vetor com todas as posicões da imagem.
00182         qt_pkt = i/1000;        //total é composto por qt_pkt + 1;
00183         m = 0;  //m é o contado para o vetor.
00184 
00185 
00186         //altera o ID do pacote.
00187         id_stc++;
00188         if(id_stc == 999) id_stc = 0;
00189 
00190         //envia os pacotes completos com 1000
00191         if (qt_pkt > 1){
00192                 for(j=0;j<qt_pkt;j++){
00193                         //printf("\nsend_pkt");
00194                         //monta pacote:
00195                         sprintf(s.cmd, "%02d", CMD_SEND);       //comando
00196                         sprintf(s.len, "%d", SFTD_BUFFER_DATA); //pacotes dentro deste loop são de 1000
00197                         s.mf = '1';     //more fragments is 1 até o ultimo pacote.
00198                         sprintf(s.nro_pkt, "%02d", j);  //nro do pacote.
00199 
00200                         //graa um pacote no buffer a ser enviado..
00201                         for(l=0;l<SFTD_BUFFER_DATA;l++){
00202                                 s.buff_send[l]= vlr[m]; //carrego o caracter no buff do pacote.
00203                                 fflush(stdout);
00204                                 m++;    //m é o contador para o vetor de caracteres da imagem.
00205                         }
00206 
00207                         sft = &s;
00208 
00209                         //se não esta aguardando um novo pacote.
00210                         resp = send_pkt();
00211 
00212                         //se erro, envia o pacote novamente.Apenas 1 vez.
00213                         if(resp== CMD_ERROR){
00214                                 sft = &s;
00215                                 //se não esta aguardando um novo pacote.
00216                                 resp = send_pkt();
00217                         }
00218                         if(resp== CMD_STOP) return CMD_STOP;
00219                         if(resp!= CMD_SEND_WAIT) return -1;
00220 
00221                 }
00222         }
00223 
00224         //se não é maior que um, mas é um pacote envia o resto dos caracteres.
00225         //envia o resto dos dados.
00226         j = i%1000;     //pega o resto dos caracteres.
00227         //monta pacote:
00228         sprintf(s.cmd, "%02d", CMD_SEND);       //comando
00229         sprintf(s.len, "%04d", j);      //pacotes com o tamanho do resto dos arquivos.
00230         s.mf = '0';     //more fragments is 0, ultimo pacote.
00231         sprintf(s.nro_pkt, "%02d", qt_pkt);     //nro do pacote.
00232         //grava 0 pacote no buffer a ser enviado..
00233         //printf("send last pkt");
00234         for(l=0;l<j;l++){
00235                 s.buff_send[l] = vlr[m];        //carrego o caracter no buff do pacote.
00236                 //printf("s-> %x  vlr-> %x ", s.buff_send[l], vlr[m]);
00237                 m++;    //m é o contador para o vetor de caracteres da imagem.
00238         }
00239         sft = &s;
00240         //se não esta aguardando um novo pacote.
00241         resp = send_pkt();
00242         //limpa struct para novo pacote.
00243         bzero(&s, sizeof(struct sft_hdr));
00244 
00245 
00246         //printf("Arquivo enviado com sucesso.\n");
00247         //se erro, envia o pacote novamente.Apenas 1 vez.
00248         if(resp== CMD_ERROR){
00249                 sft = &s;
00250                 //se não esta aguardando um novo pacote.
00251                 resp = send_pkt();
00252         }
00253         if(resp== CMD_STOP) return CMD_STOP;
00254         if(resp== CMD_SEND_WAIT) return CMD_SEND_WAIT;
00255 
00256         //send_stop();
00257 
00258         //free (aux);
00259 
00260         return 0;
00261 }
00262 
00268 int send_stop(void){
00269         struct sft_hdr s;
00270         sprintf(s.cmd, "%02d", CMD_STOP);       //comando
00271         sprintf(s.len, "0");    //pacotes com tamano 0.
00272         s.mf = '0';     //more fragments é 0, apenas um pacote.
00273         sprintf(s.nro_pkt, "01");       //nro do pacote.
00274         s.buff_send[0] = '0';
00275         //grava o ID do pacote.
00276         id_stc++;
00277         if(id_stc == 999) id_stc = 0;
00278 
00279         sft = &s;
00280 //      sprintf(sft->id, "%03d", id_stc);
00281         send(s1, (struct sft_hdr *)sft, sizeof(struct sft_hdr), 0);
00282         //resp = send_pkt();
00283         //printf("\nresp %d", resp);
00284         //if(resp!=CMD_STOP) return -1;
00285 
00286         return 0;
00287 }
00288 
00304 int sft_send_seq(char * data){
00305         DIR *diretorio;
00306         char path[30], conf[30];
00307         FILE *fp;
00308         long fp_tam;
00309         size_t result;
00310         char* fp_buff;
00311         int qt_arq, i, tempo, tipo;
00312 
00313         //abre diretório da biblioteca só para verificar se é valido, futuramente otimizar para acesso pelo diretório aos arquivos.
00314         data = strtok(data, "\n");
00315         if((diretorio = opendir(data))== NULL){
00316                 printf("error opening directory %s\n",data);
00317                 perror("opendir");
00318                 return -1;
00319         }
00320         closedir( diretorio ); //fecha diretório
00321 
00322         sprintf(path, "%s/", data);//monta caminho onde está a imagem.
00323         //printf("\nCaminho: %s", path);
00324         fflush(stdout);
00325 
00326         //arquivo de configuração.
00327         sprintf(conf, "%s/%s.conf", data, data);
00328         fp = fopen(conf,"r");
00329         if(fp == NULL){
00330                 printf("\nArquivo %s solicitado não existe na raiz deste diretorio.", conf);
00331                 return -1;
00332         }
00333         fseek (fp , 0 , SEEK_END);
00334         fp_tam = ftell (fp);
00335         rewind (fp);
00336         fp_buff = (char*) malloc (sizeof(char)*fp_tam);
00337         result = fread (fp_buff,1,fp_tam,fp);
00338         fclose (fp);
00339         //var fp_buff contem os dados do arquivo.
00340 
00341         tempo = atoi(strtok(fp_buff, " ,"));
00342         qt_arq = atoi(strtok(NULL, " ,"));
00343         tipo = atoi(strtok(NULL, " ,"));
00344 
00345         //printf("\nTempo: %02d QTD ARQ %d\n", tempo, qt_arq);
00346         int ll;
00347         while(1){
00348                 for(i=1;i<=qt_arq;i++){
00349                         sprintf(path, "%s/%d", data, i);//monta caminho onde está a imagem.
00350                         //printf("%s ", path);
00351                         if (sft_send(path)== CMD_STOP){
00352                                 //send_stop();
00353                                 return CMD_STOP;
00354                         }
00355 
00356                         //tempo de espera...
00357                         if(tipo==1) sleep(tempo); //apresentação
00358                         /*GIF*/else if(tipo==2) for(ll=0;ll<(1000000*tempo);ll++);/*usleep(tempo);*/
00359                 }
00360         }
00361 
00362         return 0;
00363 }
00364 
00371 int sft_send_loop(char * data){
00372         int resp;
00373         //while(1){
00374                 resp = sft_send_seq(data);
00375 
00376                 //limpa memória.
00377                 //memset(&sft, '\0', sizeof(struct sft_hdr));
00378                 if ( resp == CMD_STOP){
00379                         printf("send stop\n");
00380                         send_stop();
00381                 //      break;
00382                 }
00383                 else if (resp == -1 ) return -1;
00384                 //if(fgetc(stdin)!=EOF) break;
00385         //}
00386         return 0;
00387 }
00388 
00389 
00397 int trata_sft(){
00398 
00399         char* tr;
00400         char* data;
00401         int estado, j, a;
00402 
00403         //inicializa gif em0.
00404         gif = 0;
00405         //pega comando
00406         tr = strtok(buff, " ,.");//pode ser espaço ou "," ou "."
00407         //pega dados do arquivo.
00408         data = strtok(NULL, " ,.");
00409         j = strlen(tr);
00410         for(a=0;a<j;a++){       //Passa todo o texto que veio para maiusculo.
00411                 tr[a] = toupper(tr[a]);
00412                 if(tr[a] == ' '){}
00413         }
00414         //printf("|%s|", tr);
00415         if(!strcmp(tr, "SEND")) estado = CMD_SEND;
00416         else if(!strcmp(tr, "SENDSEQ")) estado = CMD_SEND_SEQ;
00417         else if(!strcmp(tr, "SENDX")) estado = CMD_SEND_X;
00418         else if(!strcmp(tr, "SENDU")) estado = CMD_SENDU;
00419         else return -1;
00420 
00421         switch (estado){
00422                 case CMD_SEND:
00423                         if(sft_send(data)==-1) return -1;
00424                         break;
00425                 case CMD_SEND_SEQ:
00426                         if(sft_send_loop(data)==-1) return -1;
00427                         break;
00428                 case CMD_SEND_X:
00429                         if(sft_send_x(data)==-1) return -1;
00430                         break;
00431                 case CMD_SENDU:
00432                         if(sft_sendu(data)==-1) return -1;
00433                         break;
00434                 default: break;
00435         }
00436 
00437         memset(sft,'\0', sizeof(sft));
00438         return 0;
00439 }
00440 
00441 
00449 int main(int argc, char *argv[])
00450 {
00451 
00452   if (argc < 2) {
00453      printf("Erro uso correto:\n") ;
00454      printf("\n    %s <hostname> \n\n", argv[0]) ;
00455      exit(1) ;
00456   }
00457 
00459   s1=socket(AF_INET, SOCK_STREAM, 0);
00460 
00461   if (s1<0) {
00462      perror("opening stream socket");
00463      exit(1);
00464   }
00465 
00466   hp = gethostbyname(argv[1]);
00467   if (hp == 0) {
00468      fprintf(stderr,"%s: Unkown host\n",argv[1]);
00469      exit(2);
00470   }
00471   
00472   server.sin_family = AF_INET;
00473   server.sin_port = htons(SFT_PORT);
00474   server.sin_addr = *((struct in_addr *)hp->h_addr);
00475   memset(&(server.sin_zero), '\0', 8);  // zero the rest of the struct 
00476     
00477 
00478   if (connect(s1, (struct sockaddr *)&server, sizeof server ) < 0) {
00479     perror("connectando stream socket");
00480     exit(1);
00481   }
00482 
00483   printf("\nSFT Conectado com sucesso...\n") ;
00484   id_stc = 0;//id do primeiro pacote
00485   
00486   do {
00487          printf("\nSFT>") ;
00488          fgets(buff,TAMMSG,stdin);//pega a informação do terminal.
00489          if(strncmp(buff, "quit",4)==0) break;
00490 
00491          if(trata_sft()== -1){
00492                  printf("Comando nao existe\n");
00493                  continue;
00494          }
00495 
00496 
00497 
00498                 } while (msg_send[0] != '.');
00499    
00500   close(s1);
00501   exit(0);
00502  
00503 }
00504 
00505 
00506 //data = nome do arquivo a ser lido
00507 int sft_send_x(char* data){
00508         FILE *fp;
00509         long fp_tam;
00510         size_t result;
00511         char* aux;
00512         char* fp_buff;
00513         int i, vlr[30000], qt_pkt, j,l,m;
00514         struct sft_hdr s;
00515 
00516         //obtem os dados do arquivo, grava tudo em fp_buff.
00517         data = strtok(data, "\n");
00518         fp = fopen(data, "r");
00519         if(fp == NULL){
00520                 printf("\nArquivo solicitado não existe na raiz deste diretorio.");
00521                 return -1;
00522         }
00523 
00524         // obtain file size:
00525         fseek (fp , 0 , SEEK_END);
00526         fp_tam = ftell (fp);
00527         rewind (fp);
00528 
00529         // allocate memory to contain the whole file:
00530         fp_buff = (char*) malloc (sizeof(char)*fp_tam);
00531         if (fp_buff == NULL) {fputs ("Memory error",stderr); return -1;}
00532 
00533         // copy the file into the buffer:
00534         result = fread (fp_buff,1,fp_tam,fp);
00535         if (result != fp_tam) {fputs ("Reading error",stderr); return -1;}
00536         // terminate
00537         fclose (fp);
00539 
00540         //fp_buff contem o arquivo para ser tratado.
00541         aux = strtok(fp_buff, " ,\"\\");
00542         //printf("\n> %s", aux);
00543         i=0;
00544         sscanf(aux, "x%x", &vlr[i]);
00545         while(1){
00546                 i++;
00547                 aux = strtok(NULL, "\\ \",\n");
00548                 if(aux==NULL) break;    //acabou a figura
00549                 //if (strlen(aux)<2) continue;  //é uma nova linha.
00550                 //printf("\n> %s", aux);
00551                 sscanf(aux, "x%x", &vlr[i]);
00552                 //printf(" -  %d\t%d", vlr[i], i);
00553                 fflush(stdout);
00554         }
00555         //while(1);
00556         //vlr é um vetor com todas as posicões da imagem.
00557         qt_pkt = i/1000;        //total é composto por qt_pkt + 1;
00558         m = 0;  //m é o contado para o vetor.
00559 
00560 
00561         //grava o ID do pacote.
00562                 id_stc++;
00563                 if(id_stc == 999) id_stc = 0;
00564 
00565 
00566         //monta pacote:
00567         sprintf(s.cmd, "%02d", CMD_SEND_X);     //comando
00568         //envia os pacotes completos com 1000
00569         if (qt_pkt > 1){
00570                 for(j=0;j<qt_pkt;j++){
00571                         //printf("\nsend_pkt");
00572                         sprintf(s.len, "1000"); //pacotes dentro deste loop são de 1000
00573                         s.mf = '1';     //more fragments is 1 até o ultimo pacote.
00574                         sprintf(s.nro_pkt, "%02d", j);  //nro do pacote.
00575 
00576                         //graa um pacote no buffer a ser enviado..
00577                         for(l=0;l<1000;l++){
00578                                 s.buff_send[l]= vlr[m]; //carrego o caracter no buff do pacote.
00579                                 fflush(stdout);
00580                                 m++;    //m é o contador para o vetor de caracteres da imagem.
00581                         }
00582 
00583                         sft = &s;
00584 
00585                         //se não esta aguardando um novo pacote.
00586                         if(send_pkt()!= CMD_SEND_WAIT) return -1;
00587 
00588                 }
00589         }
00590 
00591         //se não é maior que um, mas é um pacote envia o resto dos caracteres.
00592         //envia o resto dos dados.
00593         j = i%1000;     //pega o resto dos caracteres.
00594         sprintf(s.len, "%04d", j);      //pacotes com o tamanho do resto dos arquivos.
00595         s.mf = '0';     //more fragments is 0, ultimo pacote.
00596         sprintf(s.nro_pkt, "%02d", qt_pkt+1);   //nro do pacote.
00597         //grava 0 pacote no buffer a ser enviado..
00598         //printf("send last pkt");
00599         for(l=0;l<j;l++){
00600                 s.buff_send[l] = vlr[m];        //carrego o caracter no buff do pacote.
00601                 //printf("s-> %x  vlr-> %x ", s.buff_send[l], vlr[m]);
00602                 m++;    //m é o contador para o vetor de caracteres da imagem.
00603         }
00604         sft = &s;
00605         //se não esta aguardando um novo pacote.
00606         if(send_pkt()!=CMD_SEND_WAIT) return -1;
00607         printf("Arquivo enviado com sucesso.\n");
00608 
00609         //send_stop();
00610 
00611         //free (fp_buff);
00612         return 0;
00613 }
00614 
00615 
00624 int sft_sendu(char* data){
00625         FILE *fp;
00626         long fp_tam=0;
00627         size_t result;
00628         char* aux='\0';
00629         char* fp_buff='\0';
00630         int tst[30000];
00631         int i=0, vlr[30000], qt_pkt=0,l=0,m=0, resp=0;
00632         struct sft_hdr s;
00633 
00634         //obtem os dados do arquivo, grava tudo em fp_buff.
00635         data = strtok(data, "\n");
00636         fp = fopen(data, "r");
00637         if(fp == NULL){
00638                 printf("\nArquivo solicitado não existe na raiz deste diretorio.");
00639                 return -1;
00640         }
00641 
00642         // obtain file size:
00643         fseek (fp , 0 , SEEK_END);
00644         fp_tam = ftell (fp);
00645         rewind (fp);
00646 
00647         // allocate memory to contain the whole file:
00648         fp_buff = (char*) malloc (sizeof(char)*fp_tam);
00649         if (fp_buff == NULL) {fputs ("Memory error",stderr); return -1;}
00650 
00651         // copy the file into the buffer:
00652         result = fread (fp_buff,1,fp_tam,fp);
00653         if (result != fp_tam) {fputs ("Reading error",stderr); return -1;}
00654         // terminate
00655         fclose (fp);
00657 
00658         //fp_buff contem o arquivo para ser tratado.
00659         aux = strtok(fp_buff, " ,\"\\");
00660         //printf("\n> %s", aux);
00661         i=0;
00662         sscanf(aux, "0x%x", &vlr[i]);
00663         while(1){
00664                 i++;
00665                 aux = strtok(NULL, "\\ \",\n");
00666                 if(aux==NULL) break;    //acabou a figura
00667                 //if (strlen(aux)<2) continue;  //é uma nova linha.
00668                 //printf("\n> %s", aux);
00669                 sscanf(aux, "0x%x", &vlr[i]);
00670                 if(i>999){
00671                                 //sprintf(&tst[m], "%c", vlr[i]);       //carrego o caracter no buff do pacote.
00672                                 tst[m] = vlr[i];
00673                                 //printf("tst %x   -  vlr %x", tst[m], vlr[i]);
00674                                 //sscanf(aux, "0x%x", tst[m]);
00675                                 m++;    //m é o contador para o vetor de caracteres da imagem.
00676                         }
00677                 //printf(" -  %d\t%d", vlr[i], i);
00678                 fflush(stdout);
00679         }
00680 
00681 
00682         free (fp_buff); //--gdb   (excutar programa) --------------------------------- TLDP.org (tutoriais)
00683 
00684         //grava o ID do pacote.
00685         id_stc++;
00686         if(id_stc == 999) id_stc = 0;
00687 
00688         //monta primeiro pacote.
00689         //vlr é um vetor com todas as posicões da imagem.
00690         qt_pkt = i;     //total é composto por qt_pkt + 1;
00691         sprintf(s.cmd, "%02d", CMD_SENDU);      //comando
00692         sprintf(s.len, "%d", SFTD_BUFFER_DATA); //pacotes dentro deste loop são de 1000
00693         sprintf(s.nro_pkt, "%02d", 0);  //nro do pacote.
00694         s.mf = '1';     //more fragments is 1 até o ultimo pacote.
00695         for(l=0;l<SFTD_BUFFER_DATA;l++){
00696                 s.buff_send[l]= vlr[l]; //carrego o caracter no buff do pacote.
00697                 fflush(stdout);
00698         }
00699 
00700         sft = &s;
00701         
00702         //se não esta aguardando um novo pacote.
00703         resp = send_pkt();
00704 
00705         //se erro, envia o pacote novamente.Apenas 1 vez.
00706         if(resp== CMD_ERROR){
00707                 sft = &s;
00708                 //se não esta aguardando um novo pacote.
00709                 resp = send_pkt();
00710         }
00711         if(resp== CMD_STOP) return CMD_STOP;
00712         if(resp!= CMD_SEND_WAIT) return -1;
00713 
00714         //se não veio comando de stop, envia todos o resto do buffer.
00715         //envia sctruct.
00716 
00717         send(s1, tst, sizeof(tst), 0);
00718 
00719 
00720 
00721         //se não é maior que um, mas é um pacote envia o resto dos c
00722         return 0;
00723 }
00724 
00725 
00726