// 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; }
//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 }
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); } }