如何获取标准网络服务的端口号,协议名等

如何获取标准网络服务的端口号,协议名等

标准的网络服务(应用层协议)都规定了具体的传输协议、端口号等。如我们最常见的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头文件:

  1. struct servent *getservbyname(const char *name, const char *proto)
    1. 获取给定服务名和协议名对应的相关服务信息.
    2. name:服务名称。如ftp.
    3. proto:协议名。如tcp.
    4. return:成功返回对应的信息指针。失败返回NULL.
  2. struct servent *getservbyport(int port, const char *proto)
    1. 获取给定端口号和协议名对应的相关服务信息.

读取网络服务信息数据库相关的函数:

  1. void setservent(int stayopen)
    1. 打开服务数据库。并设置起始值。
  2. struct servent *getservent(void)
    1. 浏览数据库。获取服务数据库中的下一个条目。
  3. void endservent(void)
    1. 关闭数据库。

使用例程如下:

#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
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theboynoName

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值