WinSock网络编程学习笔记(七):协议查询程序(getprotobyname和getprotobynumber函数)

今天从书中学习了getprotobyname和getprotobyport函数。

Internet中存在着很多的协议,每一个都有着自己的名字,如IP、TCP、UDP等等。

但是当这些协议数据在网络上传输时,不是通过名字标识协议的,而是为每一种协议分配了一个编号,由IANA管理,

每一个下层协议的首部都有一个字段用来指明它的数据是属于哪个上层协议的。名字是给人看的,编号是给机器看的。

通过函数 getprotobyname、getprotobyport可以得到协议相关的信息。

函数原型:

struct protoent FAR *WSAAPI getprotobyname(const char FAR*name)

struct protoent FAR *WSAAPI getprotobynumber(int number)

成功返回指向protoent结构的指针,失败返回NULL。

下面贴出测试代码:

#include<stdlib.h>
#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32")

/*
struct protoent
{
	char FAR *p_name;			//正式协议名
	char FAR *FAR *p_aliases;	//别名列表
	short p_proto;				//协议号
}
*/
//该函数输出返回的协议信息,成功时依次输出协议名称、别名、协议编号,
//出错时则打印出错误信息
void proto_print(struct protoent *proto_info,const char * *proto_name,int proto)
{
	char **list_p;
	if(proto_info == NULL)
	{
		printf("______________________________\n");
		if(proto_name)
			printf("can't get protocol information:%s\n",proto_name);
		else 
			printf("can't get protocol information by number:%d\n",proto);
	}
	else 
	{
		printf("________________________________\n");
		printf("offical name: %s\n",proto_info->p_name);
		for(list_p = proto_info->p_aliases;*list_p != NULL; list_p++)
		{
			printf("alias:%s\n",*list_p);
		}
		printf("protocol : %d\n",proto_info->p_proto);
	}
}
int main()
{
	const char *proto_name[] = {"tcp","ipv6","esp"};
	int i,name_cnt = sizeof(proto_name) / sizeof(proto_name[0]);
	int proto_number[] = {1,8,51};
	int proto_cnt = sizeof(proto_number) / sizeof(proto_number[0]);
	struct protoent *proto_info;
	WSADATA wsaData;
	WSAStartup( (MAKEWORD(2,0)), &wsaData);
	printf("[getprotobyname] get protocol by name\n");
	for(i = 0;i < name_cnt; i++)
	{
		proto_info = getprotobyname(proto_name[i]);
		proto_print(proto_info,proto_name[i],0);
	}
	printf("\n[getprotobynumber] get protocol by number\n");
	for(i = 0 ; i<proto_cnt ; i++)
	{
		proto_info = getprotobynumber(proto_number[i]);
		proto_print(proto_info,NULL,proto_number[i]);
	}
	WSACleanup();
	return 0;


}
结果:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值