使用getservbyname解析服务名和协议名对应的端口号和服务别名
该函数的原理其实就是通过一个文本或数据库里存放的服务信息来进行解析,在Linux下就是从/etc/services这个文件获取服务信息
我们可以手动修改该文本中的信息来进行测试
#include <netdb.h>
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
struct servent *serv;
char *servname, *proto, **pptr;
if (argc != 3)
{
printf("usage: GetServByName <service_name> <proto>\n");
exit(1);
}
servname = argv[1];
proto = argv[2];
// 通过服务名和协议名获取服务信息, 返回值是一个指向servent结构体的指针
if ((serv = getservbyname(servname, proto)) == NULL)
{
printf("getservbyname error for %s: %s\n", servname, hstrerror(h_errno));
exit(2);
}
// servent结构体的s_name成员: 规范服务名
printf("official service name: %s\n", serv->s_name);
// servent结构体的s_aliases成员: 服务别名列表
for(pptr = serv->s_aliases; *pptr != NULL; pptr++)
printf("\talias: %s\n", *pptr);
// servent结构体的s_port成员: 服务端口号
printf("\tport: %d\n", ntohs(serv->s_port));
// servent结构体的s_proto成员: 服务协议名
printf("\tprotocol: %s\n", serv->s_proto);
return 0;
}