今天从书中学习了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; }结果: