如何获取标准网络服务的端口号,协议名等
标准的网络服务(应用层协议)都规定了具体的传输协议、端口号等。如我们最常见的http协议的端口号为80,使用tcp传输。本机主机在/etc/services
的网络服务数据库文件中保存了信息表。可以使用命令cat /etc/services
查看。
linux使用结构体struct servent
表示网络服务的相关信息。struct servent
各个成员的含义如下:
struct servent{
char *s_name; //服务名称
char **s_aliases; //所有别名构成的字符串数组。最后以一个字符串为NULL,用于判断数组的结束。
int s_port; //服务的端口号
char *s_proto; //连接该服务时用到的协议名,如tcp、udp等
}
下面是获取网络服务信息的相关函数,使用时需要包含netdb.h
头文件:
struct servent *getservbyname(const char *name, const char *proto)
- 获取给定服务名和协议名对应的相关服务信息.
- name:服务名称。如
ftp
. - proto:协议名。如
tcp
. - return:成功返回对应的信息指针。失败返回NULL.
struct servent *getservbyport(int port, const char *proto)
- 获取给定端口号和协议名对应的相关服务信息.
读取网络服务信息数据库相关的函数:
void setservent(int stayopen)
- 打开服务数据库。并设置起始值。
struct servent *getservent(void)
- 浏览数据库。获取服务数据库中的下一个条目。
void endservent(void)
- 关闭数据库。
使用例程如下:
#include <stdio.h>
#include <netdb.h>
void main(void)
{
struct servent *pInfo;
pInfo = getservbyname("ftp","tcp");
printf("%s:%s %d\n",pInfo->s_name,pInfo->s_proto,pInfo->s_port);
printf("别名:");
for(int i = 0; pInfo->s_aliases[i];i++){
printf("%s ",pInfo->s_aliases[i]);
}
printf("\n");
//读取网络服务信息数据库
setservent(0);
int index = 0;
while(1){
pInfo = getservent();
if(pInfo == NULL){
break;
}
printf("%s:%s %d\n",pInfo->s_name,pInfo->s_proto,pInfo->s_port);
}
endservent();
}
此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。