WinSock网络编程学习笔记(七):协议查询程序(getprotobyname和getprotobynumber函数)
2014-02-27 13:15
495 查看
今天从书中学习了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;
}结果:
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;
}结果:
相关文章推荐
- WinSock网络编程学习笔记(六):服务查询程序(getserverbyname和getserverbyport函数)
- WinSock网络编程学习笔记(五):查询主机信息
- WinSock网络编程学习笔记(八):测试bind程序
- c++学习笔记:文本查询程序
- 【学习笔记】Python网络编程(四)完善socket模拟ssh协议
- 网络编程学习笔记(二)UDP协议及聊天小程序的实现
- 【C++ Primer】【学习笔记】【第十章】关联容器之:文本查询程序
- 【学习笔记】Python网络编程(三)利用socket模拟ssh协议
- WinSock网络编程学习笔记(四)网络转换函数的实现
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Oracle_查询>(三十四)
- WinSock网络编程学习笔记(九):基于UDP实现DayTime协议
- C++ Primer 学习笔记_38_STL实践与分析(12)--容器的综合应用:文本查询程序
- 网络编程学习笔记一 第一个服务器端程序
- WinSock网络编程学习(一)Echo客户/服务器程序
- C++ Primer 学习笔记_38_STL实践与分析(12)--集成的应用程序容器:文本查询程序
- c++学习笔记-文本查询程序
- WinSock网络编程学习笔记
- JavaWeb学习笔记之tomcat与web程序结构与Http协议
- WinSock网络编程学习(二)计算校验和程序
- WinSock网络编程学习(三)判断主机字节序程序