Я действительно новичок с 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;
}
Является ли клиент иметь запись DNS - если вы не поместили его в '/ etc/hosts' для тестирования –
, уверены ли вы, что этот адрес действительно имеет запись PTR? Если что-то пойдет не так, он вернет NULL и установит 'h_errno' с ошибкой. посмотрите «man gethostbyaddr' для получения дополнительной информации. Я предполагаю, что вы ищете IP-адрес и получаете хост, который не найден. Вы можете проверить, выполнив 'host ip.address.of.client' или' dig -x ip.address.of.client' и посмотрев, что Вы получаете. (Предполагая, что вы используете dns) – Doon
@ EdHeal вы правы. В моей защите мой учитель не упомянул, что это не сработает, но, конечно, я должен был это понять сам по себе: D – andrew