Sockets 我怎么知道服务名称?
这段代码来自Stevens等人的《Unix环境中的高级编程》,图16.17是一个服务器程序,用于提供系统正常运行时间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
#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
。我没有那样做。相反,我删除一些代码并直接初始化服务器。