Пример #1
0
// the UDP client API
int udp_client(char *ip_address,char *data,int length,int remote,int type,int sd)
{
	int rBytes = 0;

    // adjust the garbler here
    set_garbler(3,3,3); 
 


	
	if(type == ROUTING)	//for routing info
		rBytes = sendto(sd, data, length, 0,(struct sockaddr *) &control_remoteServAddr[remote],sizeof(control_remoteServAddr[remote]));
	else	//for regular data transfer
	{
		rBytes = sendto(sd, data, length, 0,(struct sockaddr *) &data_remoteServAddr[remote],sizeof(data_remoteServAddr[remote]));
	}

	
	if(rBytes < 0)
	{
		//printf("\nError in sendto() in udp.c");
		//close(sd);
		return FAIL;
	}

	return rBytes;
	
}
Пример #2
0
//Envia Datagrama
void *envia_Datagrama(void *thread) {
    int id=*(int *)thread;

    int i;
    int nos_para_envio = 0;
    int aux_nos=0;
    int teste;
    int mtu=0;

    int sock,length, n;
    struct sockaddr_in server;
    struct sockaddr_in from;
    struct hostent *hp;
    //printf("\n%d ::: %s\n",data_env->no, data_env->data);
    while(1) {





        pthread_mutex_lock(&rede_enlace_rcv1);


        data_env.no_inicio = buffer_rede_enlace_env.no_inicio;
        data_env.no_envio = buffer_rede_enlace_env.no_envio;
        data_env.tam_buffer = buffer_rede_enlace_env.tam_buffer;
        data_env.id = buffer_rede_enlace_env.id;
        data_env.controle = buffer_rede_enlace_env.controle;
        data_env.no_vizinho = buffer_rede_enlace_env.no_vizinho;
        data_env.no_prox = buffer_rede_enlace_env.no_prox;
        data_env.offset = buffer_rede_enlace_env.offset;
        data_env.frag = buffer_rede_enlace_env.frag;
        memcpy(&data_env.buffer, &buffer_rede_enlace_env.buffer, buffer_rede_enlace_env.tam_buffer);
        memcpy(&data_env.dados, &buffer_rede_enlace_env.dados, buffer_rede_enlace_env.frag);

        // printf("ENLACE::BUFFER -- %s",data_env.buffer);

        pthread_mutex_unlock(&rede_enlace_env1);



        for(i=1; i <6; i++)
        {
            if(nos[i-1].no == data_env.no_prox)
                break;
        }




        char buffer[1024];
        char check_aux[1024];


        sock = socket(AF_INET, SOCK_DGRAM,0);

        //if(data_env.tam_buffer != 0){

        if(tem_ligacao(no_do_enlace,i)) {

            //fprintf(stdout,"\nEnlace Envia:::Enviando tabela de Rotas para o no:%d\n",nos_para_envio);

            //mtu = getMtu(no_do_enlace,nos_para_envio);

            //printf("ENVIA::::IP:::::%s PORTA::::%d",nos[data_env.no_envio-1].ip,nos[data_env.no_envio-1].porta);
            //printf("Mtu:::%d\n\n",mtu);

            if(sock < 0) {
                error("socket");

            }

            //Limpa Buffer



            server.sin_family = AF_INET;

            int r = tem_ligacao(no_do_enlace,data_env.no_envio);






            // strcpy(buffer,data_env.buffer);

            //TESTA MTU

            if(strlen(data_env.buffer) > mtu) {
                //error("MTU Error-> Nao foi possivel enviar o pacote");


            }

            //CHECKSUM

            data_env.tam_buffer = strlen(data_env.buffer);


            //checksum = checkSum(4);
            //printf("check::: %d\n\n",checksum);


            //sprintf(check_aux,"%d",checksum);

            //data_env.checksum = 10;


            hp = gethostbyname(nos[data_env.no_envio-1].ip);
            mtu = getMtu(no_do_enlace,data_env.no_envio);

            if(hp == 0) {
                error("Uknown host");

            }


            bcopy((char *)hp->h_addr, (char *)&server.sin_addr,hp->h_length);
            server.sin_port = htons(nos[data_env.no_envio-1].porta); //5000
            // printf("\nPorta%d",nos[data_env.no_envio-1].porta);
            length=sizeof(struct sockaddr_in);




            //Garbler

            /* printf("Tam Buffer:%d\n",data_env.tam_buffer);
             printf("No de Envio:%d\n",data_env.no_envio);
             printf("Buffer:%s\n",data_env.buffer);
             printf("Checksum:%d\n",data_env.checksum);
             printf("sizeof:%lu\n",sizeof(data_env));


                  printf("\n\n%d  %d %d %d %d %d ",data_env.dados.tabela_rotas[0].no_atual,data_env.dados.tabela_rotas[1].no_atual,data_env.dados.tabela_rotas[2].no_atual,data_env.dados.tabela_rotas[3].no_atual,data_env.dados.tabela_rotas[4].no_atual,data_env.dados.tabela_rotas[5].no_atual);
              printf("\n%d %d %d %d %d %d",data_env.dados.tabela_rotas[0].destino,data_env.dados.tabela_rotas[1].destino,data_env.dados.tabela_rotas[2].destino,data_env.dados.tabela_rotas[3].destino,data_env.dados.tabela_rotas[4].destino,data_env.dados.tabela_rotas[5].destino);
              printf("\n%d %d %d %d %d %d\n",data_env.dados.tabela_rotas[0].custo,data_env.dados.tabela_rotas[1].custo,data_env.dados.tabela_rotas[2].custo,data_env.dados.tabela_rotas[3].custo,data_env.dados.tabela_rotas[4].custo,data_env.dados.tabela_rotas[5].custo);*/



            //sleep(5);
            set_garbler(0, 0, 0);

            //printf("\n\ndata_env:%d %s %d\n\n\n",data_env.no_vizinho,data_env.buffer,no_do_enlace);


            n=sendto_garbled(sock,&data_env,sizeof(data_env),0,(struct sockaddr *)&server,length);

            if(n < 0 ) {
                error("Sendto_garbled");

            }





            /*sleep(10);

            n=sendto_garbled(sock,check_aux,strlen(check_aux),0,&server,length);

            if(n < 0 ){
            error("Sendto");

            }*/
            if(aux_nos != 0) {

                nos_para_envio=aux_nos;
                aux_nos=0;
            }

            // printf("Datagrama Enviado\n");

        }
        else {

            //fprintf(stdout,"\nEnvia:::Nós não são vizinhos ->no 1 e %d \n",nos_para_envio);

        }

        // pthread_mutex_unlock(&rede_enlace_env1);

        //}


    }//Fecha While
}
Пример #3
0
void *enviarFrames() {

    int i, j;



#ifdef DEBBUG_ENLACE
    printf("\n");
#endif

    while (1) {

        struct frame frame_env;
        struct sockaddr_in to;
        /*Variavel para setar no fim das iteracoes a variavel buffer_rede_enlace_env.retorno */
        int flag = 0;
        int atoi_result = -1;
        int s, mtu;

        /*trava mutex de sincronismo */
        pthread_mutex_lock(&mutex_rede_enlace_env2);

        /*Loop no ligacao enlaces */
        for (i = 0; i < 18; i++) {
            /*Verificar se existe ligacao entre seu nó e o nó destino */
            if ((ligacao.enlaces[i][0] == file_info.num_no) && (buffer_rede_enlace_env.env_no == ligacao.enlaces[i][1]) ||
                    (ligacao.enlaces[i][1] == file_info.num_no) && (buffer_rede_enlace_env.env_no == ligacao.enlaces[i][0])) {

#ifdef DEBBUG_ENLACE
                printf("[ENLACE] Existe Ligacao nos [Enlaces]\n");
#endif
                /*seta MTU do enlace encontrado */
                mtu = ligacao.enlaces[i][2];

                /*Loop nos nós para encontrar IP e porta do nó destino */
                for (i = 0; i < 6; i++) {
                    atoi_result = atoi(ligacao.nos[i][0]);

                    /*Verificar o IP e Porta do nó destino */
                    if (atoi_result == buffer_rede_enlace_env.env_no) {
                        /*Cria o socket */
                        if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                            perror("socket()");
                            exit(1);
                        }

#ifdef DEBBUG_ENLACE
                        printf("[ENLACE] Existe -> [Nó]: '%d',possui IP: '%s' , Porta: '%d'\n", buffer_rede_enlace_env.env_no, ligacao.nos[i][1], atoi(ligacao.nos[i][2]));
#endif

                        /*seta o IP e Porta do nó destino no sockaddr_in 'to' */
                        to.sin_family = AF_INET;
                        to.sin_port = htons(atoi(ligacao.nos[i][2])); /* Porta do nó
                        to.sin_addr.s_addr = inet_addr(ligacao.nos[i][1]); /* Endereço IP do nó

#ifdef DEBBUG_ENLACE
                        printf("[ENLACE] Nó Configurado\n");
#endif

                        /*Função que monta o frame */
                        colocarBufferFrame(&frame_env);

#ifdef DEBBUG_ENLACE
                        printf("[ENLACE] Frame Montado! tam_buffer: '%d', tam_data: '%lu', tam_frame: '%lu'\n", frame_env.tam_buffer,
                                sizeof (frame_env.data), sizeof (frame_env));
#endif

                        /*Testa tam dos dados vs MTU do nó */
                        if (frame_env.tam_buffer > mtu) {
                            printf("[ENLACE] ERRO de MTU Tamanho: '%d', MTU: '%d'\n", frame_env.tam_buffer, mtu);
                            buffer_rede_enlace_env.retorno = mtu;
                            flag = 2;
                            break;
                        }

#ifdef DEBBUG_ENLACE
                        printf("[ENLACE] frame_env.tam_buffer: '%d', MTU: '%d'\n", frame_env.tam_buffer, ligacao.enlaces[i][2]);
#endif

                        /*Funcão do calculo de checksum */
                        frame_env.ecc = checkSum(frame_env.data);

#ifdef DEBBUG_ENLACE
                        printf("[ENLACE] ECC Calculado! ecc: '%d'\n", frame_env.ecc);
#endif

                        /*Setar as variaveis L,C,D do garbler */
                        set_garbler(0, 0, 0);

                        /*Funcão que envia para o nó destino o Frame */
                        if (sendto_garbled(s, &frame_env, sizeof (frame_env), 0, (struct sockaddr *) &to, sizeof (to)) < 0) {
                            printf("[ENLACE] Dados não enviados!\n");
                            perror("sendto()");
                        } else {
                            printf("[ENLACE] Dados enviados!\n");
                            flag = 1;
                            break;
                        }

                    }
                }
            }
        }

        /*Teste da variavel flag para setar a variavel buffer_rede_enlace_env.retorno*/

        if (flag == 0) {
            buffer_rede_enlace_env.retorno = -1;
        } else if (flag == 1) {
            buffer_rede_enlace_env.retorno = 0;
        }

        /*Libera mutex para sincronismo */
        pthread_mutex_unlock(&mutex_rede_enlace_env1);
    }
}