ngx_str_t
-
typedef struct {
-
size_t len; // 指定字符串的长度
-
u_char *data; // 指向具体的字符串信息,字符串依赖长度结尾,不是以'\0'
-
} ngx_str_t
可以不用计算字符串的长度,直接使用len字段。同时可以提高内存复用,看个具体的例子:
用户请求:"GET /abc.html http/1.1\r\n",存储到内存地址为0x12345678,{len=3; data=0x12345678; }可以表示方法"GET",而不需要拷贝。
可以使用如下方式验证是否为GET方法:
-
#define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n)
-
-
method.len = 3;
-
method.data = 0x12345678;
-
return ngx_strncmp(method.data,"GET", method.len)
需要注意的是,nginx封装了很多的相关的ngx_str_t的操作接口,而以前常用的系统字串api基本以/0判断结束,ngx_str_t不能当作普通串来使用。
-
#define ngx_string(str) { sizeof(str) - 1, (u_char *) str }
-
#define ngx_null_string { 0, NULL }
-
#define ngx_str_set(str, text) (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
-
#define ngx_str_null(str) (str)->len = 0; (str)->data = NULL
其中ngx_string和ngx_null_string用于初始化时赋值,而ngx_str_set和ngx_str_null用于定义后初始化。不过c99也支持如下用法:
-
ngx_str_t str, str1;
-
str = (ngx_str_t) ngx_string("hello world");
-
str1 = (ngx_str_t) ngx_null_string
另外,根据定义看以看出,ngx_string和ngx_str_set用了sizeof,所以传进去的必须是常量字符串,否则sizeof计算值会变成指针所占的字节数。
再就是ngx_str_set和ngx_str_null要注意使用{}号了,否则语义可能会发生变化。
阅读(1121) | 评论(0) | 转发(0) |