2016-05-16 16 views
0

らスティーブンスからこのコードは。Unixの環境では、高度なプログラミング、図16.17は、システムを提供するサーバプログラムである私を混同何サービス名はどのように知ることができますか?

#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); 
} 

稼働時間のgetaddrinfo関数呼び出しあり、それただサービス名が "ruptime"であると私に教えてください。そして、私はこの名前がどこから来るか分かりません。このプログラムの名前の後にサービス名の名前はありますか?どうすればサービス名を知ることができますか?自分でサービス名を指定できますか?

私はそれがサービス名は、単に/etc/servicesに調べるための鍵である質問

答えて

2

に関係していないと思うので、私は、initserverのコードを複製し、提供していませんでした。つまり、ポート番号へのシンボリックリファレンスです。

+0

あなたのお返事ありがとうございますが、私を混乱させるのはサービス名を決定する方法ですか?自分でサービス名を指定できますか? – Sherwin

+1

Gilと同様に、サービス名は['services'](http://man7.org/linux/man-pages/man5/services.5.html)ファイルに保存されています。そのファイルに必要なカスタム項目を追加できます。 'getaddrinfo()'は 'service'パラメータが数値かどうかをチェックし、そうでない場合はファイル内の対応するエントリを検索します。 –

+0

スティーブンスのクライアントコードでは、数字の代わりに「ruptime」も使用されます。サーバーのホスト上の/ etc/servicesにエントリを追加すると、すべてのクライアントのホスト上の/ etc/servicesファイルに同じエントリを追加する必要があります。私はしませんか? –

関連する問題