void link_send_buffer(void  *buffer , int len , int node_id)
{
     


     int sock_des; 
     struct sockaddr_in server; 
     struct hostent *hp;  
     int node_index;
     uint32_t crc;
     void *snd_buffer;  
     
      
     server.sin_family = AF_INET;
     snd_buffer = expand_packet(&buffer , len  , LINK_LAYER_HEADER_SIZE);
     crc = get_crc((char *) snd_buffer + LINK_LAYER_HEADER_SIZE  , len);  
     pack_into_packet(snd_buffer , LINK_CKSUM_OFFSET , &crc , LINK_CKSUM_SIZE);    
     node_index = find_node_by_id(node_id);
     if ( node_index != NOT_FOUND)
     {
 
           hp = gethostbyname(cfg_items[node_index].node_name);
           bcopy(hp->h_addr,&(server.sin_addr.s_addr),hp->h_length);      
           server.sin_port = htons(cfg_items[node_index].udp_port);
     }
     sock_des = socket(AF_INET , SOCK_DGRAM , 0); 
     bind(sock_des,( struct sockaddr *) &server , sizeof(server));
     sendto_garbled( sock_des , snd_buffer , len + LINK_LAYER_HEADER_SIZE,0,(struct sockaddr *)&server, sizeof(server));
     
               
}
Beispiel #2
0
void enviar_mensagem()
{
	// variaveis importantes
	int s,server_address_size; 
	unsigned short portt;
	// estrutura server do tipo sockaddr_in
	struct sockaddr_in server;
	// buffer que armazena a string que contem a chamada
	int i;
	int k;
	int l;
	char c;
	int mtu;

	portt = htons(atoi(dados.port_dst));

	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
	{
		perror("socket()");
		exit(1);
	}
	
	/* Define o endereço IP e a porta do servidor */
	server.sin_family      = AF_INET;            /* Tipo do endereço         */
	server.sin_port        = portt;               /* Porta do servidor        */
	server.sin_addr.s_addr = inet_addr(dados.ip_dst); /* Endereço IP do servidor  */
	
	//printf("\n\nBUFF: %s",buf);

	server_address_size = sizeof(server);


	for (k = 0; k < (strlen(buf)); k++)
	{
		l = buf[k];
		soma += l;
	}

//	printf("soma %d\n",soma);

	 // sizeof(server) envia o tamanho da estrutura server
	//if (sendto(s, buf, sizeof(buf)+1, 0, (struct sockaddr *)&server, sizeof(server)) < 0)
	
	
	if (sendto_garbled(s, buf, sizeof(buf)+1,0,(struct sockaddr *)&server,sizeof(server)) < 0)
	// caso ocorra algum problema, o retorno sera -1 e printa a mensagem senao envia a msg
	{
		perror("sendto()");
		exit(2);
	}
}
Beispiel #3
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
}
Beispiel #4
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);
    }
}