Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 我怎么知道服务名称?_Sockets_Unix_Service_Ip Address_Systems Programming - Fatal编程技术网

Sockets 我怎么知道服务名称?

Sockets 我怎么知道服务名称?,sockets,unix,service,ip-address,systems-programming,Sockets,Unix,Service,Ip Address,Systems Programming,这段代码来自Stevens等人的《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

这段代码来自Stevens等人的《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);
}
#包括“apue.h”
#包括
#包括
#包括
#包括
#定义BUFLEN 128
#定义QLEN 10
#ifndef主机\u名称\u最大值
#定义主机名最多256个
#恩迪夫
extern int initserver(int,const struct sockaddr*,socklen\u t,int);
无效的
发球(内接发球);
int
main(int argc,char*argv[])
{
结构addrinfo*ailist,*aip;
结构addrinfo提示;
int sockfd,err,n;
字符*主机;
如果(argc!=1)
err_quit(“用法:ruptimed”);
如果((n=sysconf(\u SC\u HOST\u NAME\u MAX))<0)
n=主机名\u MAX;/*最佳猜测*/
如果((主机=malloc(n))==NULL)
错误系统(“malloc错误”);
if(gethostname(主机,n)<0)
err_sys(“gethostname错误”);
daemonize(“破裂”);
memset(&hint,0,sizeof(hint));
hint.ai_flags=ai_CANONNAME;
hint.ai_socktype=SOCK_流;
hint.ai_canonname=NULL;
hint.ai_addr=NULL;
hint.ai_next=NULL;
if((err=getaddrinfo(主机,&ruptime,&hint,&ailist))!=0){
系统日志(日志错误,“中断时间:getaddrinfo错误:%s”,
盖乌斯特雷罗(呃),;
出口(1);
}
for(aip=ailist;aip!=NULL;aip=aip->ai_next){
如果((sockfd=initserver)(SOCK_流,aip->ai_addr,
aip->ai_addrlen,QLEN))>=0){
发球(sockfd);
出口(0);
}
}
出口(1);
}
让我困惑的是函数调用
getaddrinfo
,它只告诉我服务名称是
ruptime
,我不知道这个名称来自哪里。服务名称是否以该程序的名称命名?如何确定服务名称?我可以自己指定服务名称吗


我没有复制
initserver
service
的代码,因为我认为这与问题无关。

服务名称只是在
/etc/services
中查找的一个键;i、 e.这是对端口号的象征性引用。

谢谢您的回答,但让我困惑的是如何确定服务名称?我可以自己指定服务名称吗?正如吉尔所说,服务名称存储在文件中。您可以向该文件添加任何自定义条目
getaddrinfo()
将检查
service
参数是否为数字,如果不是,则查找文件中的相应条目。史蒂文斯的客户端代码也使用“ruptime”而不是数字。如果我向服务器主机上的/etc/services添加一个条目,我还需要向所有客户端主机上的/etc/services文件添加相同的条目。我不会吗?没错。如果使用该名称,它必须出现在执行代码的每个主机的本地/etc/services文件中。我在同一本书中做同样的练习,我从
getaddrinfo
中得到一个错误,因为我认为服务
ruptime
不存在。您是如何定义和创建此服务的?我在书中找不到关于创建此服务的任何参考:是吗?@FrancescoBoi似乎您需要自己将此服务添加到
/etc/service
。我没有那样做。相反,我删除一些代码并直接初始化服务器。