inet_pton()
не ищет имена хостов, такие как time.mit.edu
.Это просто для преобразования строковой формы IP-адреса, такого как "18.7.21.144"
, в адрес сокета.
Вы должны использовать getaddrinfo()
, чтобы найти имя, подобное "time.mit.edu"
.Он также может выполнять поиск номера порта daytime
.Ваш код будет выглядеть так:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
struct addrinfo *addr;
struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_DGRAM };
int err;
int connectionFd, in;
char buf[1024];
err = getaddrinfo("time.mit.edu", "daytime", &hints, &addr);
if (err) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
return 1;
}
connectionFd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
sendto(connectionFd, "." , 1, 0, addr->ai_addr, addr->ai_addrlen );
freeaddrinfo(addr);
in = recv(connectionFd, buf, sizeof buf - 1, 0 ) ;
buf[in] = 0 ;
printf("Time is %s \n",buf);
close(connectionFd);
return 0;
}
(Смотри, Ма: дневное время с поддержкой IPv6;)
Конечно, вы должны также проверять возвращаемое значение socket()
, sendto()
и recv()
, так же, как я сделал для getaddrinfo()
.В частности, рассмотрим, что произойдет, если recv()
завершится неудачно и вернет -1 ...