Ajuda com programação de sockets para linux em c | ZWAME Fórum
Ajuda com programação de sockets para linux em c
Discussão em 'Programação' iniciada por moody, 27 de Outubro de 2008. (Respostas: 3; Visualizações: 689)
Estou a fazer uma pequena aplicação cliente/servidor de partilha de ficheiros em C , e estou a tentar implementar o seguinte:
O cliente da minha aplicaçao envia para o endereço 255.255.255.255 uma mensagem a pedir um determinado ficheiro.Na rede existe apenas um servidor,no entanto pode haver vários clientes.
O servidor responde com um ACK caso possua o ficheiro especificado pelo cliente.Até aqui tudo bem.
A dúvida surge é agora,pois pretendo com que o cliente,após receber a confirmação(ACK) do servidor,verifique se a mensagem de resposta vem do servidor ou se a mensagem é de origem desconhecida.Para tal tenho a seguinte linha de código no cliente:
msg_tam=recvfrom(socketfd,buffer,BUFFERSIZE,0,(struct sockaddr*)&serv_addr,&nbytes);
if(msg_tam<0)
Abort("...");
buffer[msg_tam]=0;
if(SERV_HOST_PORT==ntohs(serv_addr.sin_port) && strcmp(SERV_HOST_ADDR,(char*) inet_ntoa(serv_addr.sin_addr)==0)
printf("mensagem de origem desconhecida!");
O SERV_HOST_ADDR está definido com "255.255.255.255" para o cliente poder enviar o pedido de ficheiro para a rede e o porto está definido também com um valor.Ora,o problema surge aquando da chamada à função recvfrom em que o endereço ip de quem enviou a mensagem é preenchido na estrutura.Esse endereço é,portanto o endereço onde se encontra o utilizador.
Assim,ao fazer a comparação no if do SERV_HOST_ADDR com o endereço serv_addr.sin_addr preenchido na chamada ao recvfrom, eles nunca vão ser iguais(mesmo que a resposta tenha vindo do servidor) e vai entrar sempre no else.
O que eu pretendia era que alguém me pudesse ajudar a solucionar este problema, de maneira que o cliente verificasse se a resposta vem do servidor para onde enviou a mensagem ou de outro sitio.
Desde já,obrigado pela ajuda!
Estou bem mais atrasado que tu... por outras palavras... estou lixado
Penso que será impossível sem incluir mais informação na mensagem sem ser o ACK (por exemplo o nome do ficheiro a replicar). Mas como é suposto a mensagem ser só ACK...
Todas as tuas conclusões estão certas. O 255.255.255.255 não é um endereço válido, é uma máscara de broadcast e ninguém pode enviar um pacote IP com esse endereço como fonte.
Se não sabes o endereço do servidor, então envia um número aleatório e faz o servidor responder esse número + 1 e verifica a resposta. Na prática isto seria feito com mensagens cifradas, para ter a certeza que o servidor entendeu a nossa mensagem cifrada.
De qualquer modo, como viste, por aí não vais lá. Outra coisa, podes comparar o endereço IP de forma numérica, evitando a comparação de strings.