Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1503995
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2015-10-23 17:44:17

ngx_str_t

点击(此处)折叠或打开

  1. typedef struct {
  2.     size_t len;          // 指定字符串的长度
  3.     u_char *data;        // 指向具体的字符串信息,字符串依赖长度结尾,不是以'\0'
  4. } ngx_str_t
可以不用计算字符串的长度,直接使用len字段。同时可以提高内存复用,看个具体的例子:
用户请求:"GET /abc.html http/1.1\r\n",存储到内存地址为0x12345678,{len=3; data=0x12345678; }可以表示方法"GET",而不需要拷贝。
可以使用如下方式验证是否为GET方法:

点击(此处)折叠或打开

  1. #define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n)

  2. method.len = 3;
  3. method.data = 0x12345678;
  4. return ngx_strncmp(method.data,"GET", method.len)
需要注意的是,nginx封装了很多的相关的ngx_str_t的操作接口,而以前常用的系统字串api基本以/0判断结束,ngx_str_t不能当作普通串来使用。

点击(此处)折叠或打开

  1. #define ngx_string(str) { sizeof(str) - 1, (u_char *) str }
  2. #define ngx_null_string { 0, NULL }
  3. #define ngx_str_set(str, text) (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
  4. #define ngx_str_null(str) (str)->len = 0; (str)->data = NULL
其中ngx_string和ngx_null_string用于初始化时赋值,而ngx_str_set和ngx_str_null用于定义后初始化。不过c99也支持如下用法:

点击(此处)折叠或打开

  1. ngx_str_t str, str1;
  2. str = (ngx_str_t) ngx_string("hello world");
  3. str1 = (ngx_str_t) ngx_null_string
另外,根据定义看以看出,ngx_string和ngx_str_set用了sizeof,所以传进去的必须是常量
字符串,否则sizeof计算值会变成指针所占的字节数。
再就是ngx_str_set和ngx_str_null要注意使用{}号了,否则语义可能会发生变化。





阅读(1121) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~