如何获取网络协议的协议号

如何获取网络协议的协议号

网络层中的IP数据报的首部有一个协议字段。占8位。用来标识数据报中的报文使用何种协议。以便使目的主机的IP层知道应将报文数据上交给哪个处理过程。我们常用到的tcp协议的协议号为6,UDP为17,ICMP为1等。本机主机在/etc/protocols的协议数据库文件中保存了协议名与协议号之间的映射表。可以使用命令cat /etc/protocols查看。
linux使用结构体struct protoent表示协议的映射信息。struct protoent各个成员的含义如下:

struct protoent {
    char  *p_name;       // 官方名称
    char **p_aliases;    // 所有别名构成的字符串数组。最后以一个字符串为NULL,用于判断数组的结束。
    int    p_proto;      // 协议号
}

下面是获取协议信息的相关函数,使用时需要包含netdb.h头文件:

  1. struct protoent *getprotobyname(const char *name)
    1. 通过协议名称获取指定网络协议的信息体。
    2. name:协议名。如"tcp".
    3. return:成功返回信息体指针,失败返回NULL.
  2. struct protoent *getprotobynumber(int proto)
    1. 通过协议号获取指定网络协议的信息体。
    2. proto:协议号。如6.

读取协议数据库相关的函数:

  1. void setprotoent(int stayopen)
    1. 打开协议数据库。并设置起始值。
  2. struct protoent *getprotoent(void)
    1. 浏览数据库。获取服务数据库中的下一个条目。
  3. void endprotoent(void)
    1. 关闭数据库。

使用例程如下:

#include <stdio.h>
#include <netdb.h>

void main(void)
{
    struct protoent *pInfo;
    pInfo = getprotobyname("tcp");
    printf("%s:%d\n",pInfo->p_name,pInfo->p_proto);
    printf("别名:");
    for(int i = 0; pInfo->p_aliases[i];i++){
        printf("%s ",pInfo->p_aliases[i]);
    }
    printf("\n");

    //读取协议数据库
    setprotoent(0);
    int index = 0;
    while(1){
        pInfo = getprotoent();
        if(pInfo == NULL){
            break;
        }
        printf("[%2d]%s:%d\n",++index,pInfo->p_name,pInfo->p_proto);
    }
    endprotoent();
}

此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

theboynoName

感谢鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值