FreeBSD C kütüphanesi soket programlama için birçok yardımcı program içerir. Örneğin model istemcimizde time.nist.gov IP adresini kodlamamız zor oldu. Ama biz herzaman IP adresini bilmeyiz. Biz yapmış olmasak bile eğer yazılımımız kullanıcıya IP adresi veya alan adıgirme imkanıverseydi daha esnek olurdu.
Alan adının direk olarak herhangi bir soket fonksiyonuna geçirilememesinden dolayıFreeBSD C kütüphanesi netdb.h da
gethostbyname(3)ve
gethostbyname2(3)fonksiyonlarıile gelmiştir.
struct hostent * gethostbyname(const char *name); struct hostent * gethostbyname2(const char *name, int af);
İkisi de hostent yapısına alan ile ilgili bir çok bilgi ile işaretçi döndürür. Bizim amaçlarımız için, yapının h_addr_list[0] alanıağ bayt sırasında olan doğru adresin h_length baytına işaret eder.
Bu bize daytime programımızın daha esnek ve daha kullanışlı versiyonunu oluşturma imkanısağlar:
/*
 * daytime.c
 *
 * Programmed by G. Adam Stanislav
 * 19 June 2001
 */
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
  register int s;
  register int bytes;
  struct sockaddr_in sa;
  struct hostent *he;
  char buf[BUFSIZ+1];
  char *host;
  if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
    perror("socket");
    return 1;
  }
  bzero(&sa, sizeof sa);
  sa.sin_family = AF_INET;
  sa.sin_port = htons(13);
  host = (argc > 1) ? (char *)argv[1] : "time.nist.gov";
  if ((he = gethostbyname(host)) == NULL) {
    herror(host);
    return 2;
  }
  bcopy(he->h_addr_list[0],&sa.sin_addr, he->h_length);
  if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
    perror("connect");
    return 3;
  }
  while ((bytes = read(s, buf, BUFSIZ)) > 0)
    write(1, buf, bytes);
  close(s);
  return 0;
}Şimdi bir alan adını(veya bir ip adresi, her ikisi de çalışır) komut satırında girebiliriz, ve program daytime sunucusunda bağlanmaya çalışacaktır. Aksi takdirde hala varsayılan olarak time.nist.gov dur. Ayrıca bu durumda bile gethostbyname'i kullanacağız, kendimizi zorlayarak 192.43.244.18 yazmayacağız. Bu yolla ilerde IP adresi değişse de hala onu bulacağız.
Sanal olarak yerel sunucudan zaman bilgisini almak zaman almadığından, daytime'ıbir satırda iki kez çalıştırabilirsin: İlki zamanıtime.nist.gov dan almak için, ikincisi ise kendi sisteminden almak için. Daha sonra sonuçlarıkıyaslayıp sistem saatinin ne kadar doğru olduğuna bakabilirsin:
 % daytime ;daytime localhost  52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *
         2001-06-20T04:02:35Z  % Görüldüğü gibi benim sistemim NIST in saatinden 2 saniye ileride.
Bazen belli bir servisin hangi portu kullandığından emin olamazsın. netdb.h da tanımlı
getservbyname(3)fonksiyonu bu durumlarda çok kullanışlıdır:
 struct servent * getservbyname(const char *name, const
        char *proto);servent yapısıağ bayt sıralamasışeklinde uygun port numarasını s_port değişkeninde tutar. Daytime sunucunun doğru portunu bilmiyorsak şu şekilde bulabiliriz:
  struct servent *se;
  ...
  if ((se = getservbyname("daytime", "tcp")) == NULL {
    fprintf(stderr, "Cannot determine which port to use.\n");
    return 7;
  }
  sa.sin_port = se->s_port;Genellikle portu bilirsin. Ama eğer yeni bir protokol geliştiriyorsan, belki onu resmi olmayan bir portta test ediyor olabilirsin. Bir gün protokol ve portu kayıt edeceksin ( hiç bir yer olmazsa bile, en azından getservbyname in baktığı /etc/services dosyasına kayıt edeceksin). Yukarıdaki kodda hata dönmek yerine sadece geçici port numarasını kullanacaksın. Bir kere protokolü /etc/services da listeledinmi, yazılımın portunu tekrar kod yazmana gerek kalmadan bulacaktır.