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
danke für Ihre Antwort, aber was verwirrt mich ist, wie man den Service-Namen feststellen? Kann ich den Servicenamen selbst bestimmen? – Sherwin
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. –
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? –