获取协议名、协议号——getprotoent(),getprotobyname(),getprotobynumber()

604 篇文章 8 订阅
579 篇文章 5 订阅
  1. /* Description of data base entry for a single service.  */  
  2. struct protoent  
  3. {  
  4.   char *p_name;         /* Official protocol name.  */  
  5.   char **p_aliases;     /* Alias list.  */  
  6.   int p_proto;          /* Protocol number.  */  
  7. };  
  8. struct protoent *getprotoent(void);  
  9. struct protoent *getprotobyname(const char *name);  
  10. struct protoent *getprotobynumber(int proto);  
  11. void setprotoent(int stayopen);  
  12. void endprotoent(void);  
说明:

(1) 这几个函数的原理是读取文件 /etc/protocols (ubuntu下)

/etc/protocols 设定了主机使用的协议以及各个协议的协议号/

协议(Protocol):长度8比特。标识了上层所使用的协议。

这里的上层不是逻辑上的传输层,而是实际网络环境中的ip下一层,即可能包括icmp,igmp

  1. /** 
  2.  * getprotoent() 
  3.  * OS: Ubuntu 11.04 Server 
  4.  */  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include <netdb.h>  
  8.   
  9. static void printproto(struct protoent *proto);  
  10.   
  11. int main()  
  12. {  
  13.     struct protoent *proto = NULL;  
  14.     setprotoent(1);  
  15.     while( (proto = getprotoent()) != NULL )  
  16.     {  
  17.         printproto(proto);  
  18.         printf("\n");  
  19.     }  
  20.     endprotoent();  
  21.     return 0;  
  22. }  
  23. static void printproto(struct protoent *proto)  
  24. {  
  25.     char **p = NULL;  
  26.       
  27.     printf("protocol: %s\n", proto->p_name);  
  28.       
  29.     for(p = proto->p_aliases; *p; p++)  
  30.     {  
  31.         printf("alias: %s\n", *p);  
  32.     }  
  33.       
  34.     printf("protocol: %d\n", proto->p_proto);  
  35. }  
  36. /* 
  37. output: 
  38. protocol: ip 
  39. alias: IP 
  40. protocol: 0 
  41.  
  42. protocol: icmp 
  43. alias: ICMP 
  44. protocol: 1 
  45.  
  46. protocol: igmp 
  47. alias: IGMP 
  48. protocol: 2 
  49.  
  50. ... 
  51.  
  52. 读取文件:/etc/protocols 
  53. */



  54.  
    1. ---------------------------------------------------------我是分割线-------------------------------------------------
    相关函数:getprotobyname, getprotoent, setprotoent, endprotoent
    表头文件:#include <netdb.h>
    函数定义:struct protoent *getprotobynumber(int proto)
    函数说明:getprotobynumber()会返回一个protoent结构,参数proto为欲查询的网络协议编号。此函数会从 /etc/protocols中查找符合条件的数据并由结构protoent返回。 结构protoent定义请参getprotoent()
    返回值   :成功则返回protoent结构指印,若有错误或找不到各个符合的数据则返回NULL指针


    struct protoent结构

    在snort.c中的函数void InitProtoNames()的作用是取得协议名放在protocol_names[256]       
    struct protoent { 
            char *       p_name; //名称
            char *               p_aliases; //别名
            short *       p_proto; //编号
           }  
    getprotobyname():依照通讯协定 (protocol) 的名称来获取该通讯协定的其他资料。 
      格 式: struct protoent * getprotobyname( const char *name ); 
      参 数: name   通讯协定名称 
      传回值: 成功 - 一指向 struct protoent 的指针 

           失败 - NULL  说明: 利用通讯协定的名称来得知该通讯协定的别名、编号等资料。 
    getprotobynumber():依照通讯协定的编号来获取该通讯协定的其他资料。 
      格 式: struct protoent * getprotobynumber( int number ); 
      参 数: number  以 host 排列方式的通讯协定编号 
      传回值: 成功 - 一指向 struct protoent 的指针 
           失败 - NULL  
      说明: 利用通讯协定的编号来得知该通讯协定的名称、别名等资料。 

    另外,:-)
    toupper(char c)将字符c转换为大写英文字母。
    d = strdup(char * s)复制字符串s到d,返回指向被复制的字符串的指针,所需空间由malloc()分配且可以由free()释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值