Ajuda com programação de sockets para linux em c

moody

Membro
Boas!

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:

Código:
...
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)
{
...
}
else
    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!
 
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.
 
Back
Topo