1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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: 611)

  1. 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!
     
  2. MrOverclock

    MrOverclock Power Member

    ISEC?
    Estou bem mais atrasado que tu... por outras palavras... estou lixado >(
     
  3. zgruli

    zgruli Power Member

    Mais um. :)

    Ontopic:
    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...
     
  4. bsd

    bsd Power Member

    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.
     

Partilhar esta Página