- /* Description of data base entry for a single service. */
- struct protoent
- {
- char *p_name; /* Official protocol name. */
- char **p_aliases; /* Alias list. */
- int p_proto; /* Protocol number. */
- };
- struct protoent *getprotoent(void);
- struct protoent *getprotobyname(const char *name);
- struct protoent *getprotobynumber(int proto);
- void setprotoent(int stayopen);
- void endprotoent(void);
(1) 这几个函数的原理是读取文件 /etc/protocols (ubuntu下)
/etc/protocols 设定了主机使用的协议以及各个协议的协议号/
协议(Protocol):长度8比特。标识了上层所使用的协议。
这里的上层不是逻辑上的传输层,而是实际网络环境中的ip下一层,即可能包括icmp,igmp
- /**
- * getprotoent()
- * OS: Ubuntu 11.04 Server
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <netdb.h>
- static void printproto(struct protoent *proto);
- int main()
- {
- struct protoent *proto = NULL;
- setprotoent(1);
- while( (proto = getprotoent()) != NULL )
- {
- printproto(proto);
- printf("\n");
- }
- endprotoent();
- return 0;
- }
- static void printproto(struct protoent *proto)
- {
- char **p = NULL;
- printf("protocol: %s\n", proto->p_name);
- for(p = proto->p_aliases; *p; p++)
- {
- printf("alias: %s\n", *p);
- }
- printf("protocol: %d\n", proto->p_proto);
- }
- /*
- output:
- protocol: ip
- alias: IP
- protocol: 0
- protocol: icmp
- alias: ICMP
- protocol: 1
- protocol: igmp
- alias: IGMP
- protocol: 2
- ...
- 读取文件:/etc/protocols
- */
-
- ---------------------------------------------------------我是分割线-------------------------------------------------
表头文件:#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()释放。 - ---------------------------------------------------------我是分割线-------------------------------------------------