2016-05-16 11 views
0

dieser Code von Stevens et al.,Advanced Programming in der Unix-Umgebung, Abbildung 16.17 ist ein Server-ProgrammsystemWie kann ich den Servicenamen kennen?

#include "apue.h" 
#include <netdb.h> 
#include <errno.h> 
#include <syslog.h> 
#include <sys/socket.h> 

#define BUFLEN 128 
#define QLEN 10 

#ifndef HOST_NAME_MAX 
#define HOST_NAME_MAX 256 
#endif 

extern int initserver(int, const struct sockaddr *, socklen_t, int); 
void 
serve(int socked); 

int 
main(int argc, char *argv[]) 
{ 
    struct addrinfo *ailist, *aip; 
    struct addrinfo hint; 
    int    sockfd, err, n; 
    char   *host; 

    if (argc != 1) 
     err_quit("usage: ruptimed"); 
    if ((n = sysconf(_SC_HOST_NAME_MAX)) < 0) 
     n = HOST_NAME_MAX; /* best guess */ 
    if ((host = malloc(n)) == NULL) 
     err_sys("malloc error"); 
    if (gethostname(host, n) < 0) 
     err_sys("gethostname error"); 
    daemonize("ruptimed"); 
    memset(&hint, 0, sizeof(hint)); 
    hint.ai_flags = AI_CANONNAME; 
    hint.ai_socktype = SOCK_STREAM; 
    hint.ai_canonname = NULL; 
    hint.ai_addr = NULL; 
    hint.ai_next = NULL; 
    if ((err = getaddrinfo(host, "ruptime", &hint, &ailist)) != 0) { 
     syslog(LOG_ERR, "ruptimed: getaddrinfo error: %s", 
      gai_strerror(err)); 
     exit(1); 
    } 
    for (aip = ailist; aip != NULL; aip = aip->ai_next) { 
     if ((sockfd = initserver(SOCK_STREAM, aip->ai_addr, 
      aip->ai_addrlen, QLEN)) >= 0) { 
      serve(sockfd); 
      exit(0); 
     } 
    } 
    exit(1); 
} 

was mir der Funktionsaufruf Getaddrinfo, es ist verwirrt uptime zu schaffen Sag mir einfach, der Service-Name ist "rupttime", und ich habe keine Ahnung, wo dieser Name herkommt. Funktioniert der Name des Dienstnamens nach dem Namen dieses Programms? Wie kann ich den Servicenamen ermitteln? Kann ich den Servicenamen selbst bestimmen?

i duplizieren nicht den Code initserver und dienen, weil ich denke, es ist nicht die Frage betreffen

Antwort

2

Der Servicename einfach ein Schlüssel in /etc/services zu sehen ist; d.h. es ist ein symbolischer Verweis auf eine Portnummer.

+0

danke für Ihre Antwort, aber was verwirrt mich ist, wie man den Service-Namen feststellen? Kann ich den Servicenamen selbst bestimmen? – Sherwin

+1

Wie Gil sagte, sind die Dienstnamen in der Datei ['services'] (http://man7.org/linux/man-pages/man5/services.5.html) gespeichert. Sie können beliebige benutzerdefinierte Einträge zu dieser Datei hinzufügen. 'getaddrinfo()' überprüft, ob der 'service' Parameter numerisch ist, und wenn nicht, dann suche den entsprechenden Eintrag in der Datei. –

+0

Der Client-Code von Stevens verwendet auch "rupttime" anstelle einer Ziffer. Wenn ich auf dem Host des Servers einen Eintrag zu/etc/services hinzufüge, müsste ich auch den/etc/services-Dateien auf den Hosts aller Clients denselben Eintrag hinzufügen. Würde ich nicht? –

Verwandte Themen