2014-12-26 2 views
0

Я действительно новичок с C и сокетами. Я знаю, что я не должен использовать gethostbyaddr, это для экзамена, поэтому я должен использовать то, что они говорят мне использовать ... Я использую этот код с Linux-машины (Ubuntu 14.04).C gethostbyaddr возвращает NULL

Я пытаюсь написать программу echo c/s. Все работает нормально, но когда я пытаюсь получить некоторую информацию о клиенте с моего сервера, struct hostent * clienthost имеет значение NULL.

Это мой server.c:

int main(int argc, char * argv[]) 
{ 
    struct sockaddr_in cliaddr, servaddr; 
    struct hostent * clienthost; 
    int port, sd, len; 
    char request[MAX_LENGTH]; 
    const int on = 1; 

    port = atoi(argv[1]); 

    memset ((char *)&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = INADDR_ANY; 
    servaddr.sin_port = htons(port); 

    sd=socket(AF_INET, SOCK_DGRAM, 0); 
    setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); 
    bind(sd,(struct sockaddr *) &servaddr, sizeof(servaddr)); 

    for (;;) 
    { 
     len = sizeof(request); 
     recvfrom(sd, request, sizeof(request), 0, (struct sockaddr *) &cliaddr, &len); 

     clienthost = gethostbyaddr((char *) &cliaddr.sin_addr, sizeof(cliaddr.sin_addr), AF_INET); 
     if (clienthost == NULL) 
      printf("client host information not found\n"); 
     else 
      printf("Operation from: %s %i\n", clienthost->h_name,(unsigned)ntohs(cliaddr.sin_port)); 

     sendto(sd, &request, sizeof(request), 0, (struct sockaddr *)&cliaddr, len); 
    } 

    return 0; 
} 
+1

Является ли клиент иметь запись DNS - если вы не поместили его в '/ etc/hosts' для тестирования –

+0

, уверены ли вы, что этот адрес действительно имеет запись PTR? Если что-то пойдет не так, он вернет NULL и установит 'h_errno' с ошибкой. посмотрите «man gethostbyaddr' для получения дополнительной информации. Я предполагаю, что вы ищете IP-адрес и получаете хост, который не найден. Вы можете проверить, выполнив 'host ip.address.of.client' или' dig -x ip.address.of.client' и посмотрев, что Вы получаете. (Предполагая, что вы используете dns) – Doon

+0

@ EdHeal вы правы. В моей защите мой учитель не упомянул, что это не сработает, но, конечно, я должен был это понять сам по себе: D – andrew

ответ

0

Является ли клиент иметь запись DNS - если не поставить один в /etc/hosts для тестирования –   Ed Лечение

Смежные вопросы