名字
和端口号
的映射存放在/etc/services配置文件中,那么之后,尽管端口号发生改变,我们仅仅需要修改/etc/services配置文件中某个服务对应的端口号即可(不需要重新编译程序)。
使用 服务名+协议名 或 端口号+协议名 得到 struct servent 结构体(某个服务的详细信息),先介绍该结构体:
先介绍 struct servent 结构体
struct servent{
char* s_name; 服务名
char** s_aliases; 别名列表
int s_port; 端口号(网络字节序)
char* s_proto; 使用的协议
}
① getservbyname
:使用 servname+protoname ,得到 struct servent
struct servent* getservbyname(const char* servname, const char* protoname);
参数:servname服务名; protoname协议,有TCP、UDP等。
返回值:若成功,返回非空指针;失败,返回NULL
struct servent* sptr = getservbyname(“domain”, “udp”);
struct servent* sptr = getservbyname(“FTP”, NULL);
② getservbyport
:使用 端口号+protoname ,得到 struct servent
struct servent* getservbyport(int port, const char* protoname);
参数:port必须是网络字节序
struct servent* sptr = getservbyport(htons(53), “udp”);
struct servent* sptr = getservbyport(htons(21), “tcp”);