标签:eof play 符号 eth style 结束 一段 out err
环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字)。
应用:有了它,服务器后台程序可以借此对数据库查询相关信息。
头文件
1 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ 2 #ifndef _HEAD_H_ 3 #define _HEAD_H_ 4 #include "status.h" 5 /* 6 * 相关类型 7 */ 8 typedef unsigned char uChar; 9 10 /* 11 * 获取指定键的键值 12 * 13 * queryStr -- 请求信息的字符串 14 * keyName -- 指定的键名 15 * resultp -- (用指针)返回键值 16 * 返回值,如果操作成功返回OK;否则返回ERROR。 17 */ 18 STATUS 19 GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp); 20 #endif
接口定义
1 /* 这是一份描述从Http请求信息中提取有效键值的接口定义文件 */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include "head.h" 6 #include "status.h" 7 8 /* 9 * 内部接口 10 * 11 * 12 * 统计键值的字节数目。 13 * 14 * keyValue -- 指定的键值 15 * 返回值,返回统计的结果。 16 */ 17 static int 18 GetItsSize(char const *keyValue) 19 { 20 char const *p = NULL; 21 char ch; 22 int counter = 0; 23 24 if(keyValue == NULL) //检查参数是否有效 25 { 26 fprintf(stdout, "传递给函数GetItsSize的参数keyValue无效。\n"); 27 return -1; 28 } 29 30 for(p = keyValue; (ch = *p) != ‘\0‘; p ++) //统计键值的长度 31 { 32 if(ch == ‘&‘) //表示键值结束 33 { 34 break; 35 } 36 if(ch == ‘%‘) 37 { 38 p += 2; 39 } 40 counter ++; 41 } 42 return counter; 43 } 44 45 /* 46 * 把两位16进制转换为10进制,并返回结果。 47 * 48 * digit1 -- 第一位16进制 49 * digit2 -- 第二位16进制 50 * 返回值,返回结果(返回类型是无符号整型)。 51 */ 52 static uChar 53 MergeThem(char digit1, char digit2) 54 { 55 uChar result; 56 int v1,v2; 57 58 v1 = (digit1 <= ‘Z‘ && digit1 >= ‘A‘)? digit1 - ‘A‘ + 10 : digit1 - ‘0‘; 59 v2 = (digit2 <= ‘Z‘ && digit2 >= ‘A‘)? digit2 - ‘A‘ + 10 : digit2 - ‘0‘; 60 result = v1 * 16 + v2; 61 return result; 62 } 63 64 65 /* 66 * 外部接口 67 * 68 * 69 * 获取指定键的键值。 70 * 71 * queryStr -- 请求信息的字符串 72 * keyName -- 指定的键名 73 * resultp -- (用指针)返回键值 74 * 返回值,如果操作成功返回OK;否则返回ERROR。 75 */ 76 STATUS 77 GetTheKeyValue(char const *queryStr, char const *keyName, uChar **resultp) 78 { 79 uChar *result = NULL; //存放键值 80 char const *p = NULL; 81 char ch; 82 int keyValueSize; 83 int i = 0; 84 85 if(queryStr == NULL) //检查参数是否有效 86 { 87 fprintf(stdout, "传递给函数GetTheKeyValue的参数queryStr无效。\n"); 88 return ERROR; 89 } 90 if(keyName == NULL) 91 { 92 fprintf(stdout, "传递给函数GetTheKeyValue的参数keyName无效。\n"); 93 return ERROR; 94 } 95 if(resultp == NULL) 96 { 97 fprintf(stdout, "传递给函数GetTheKeyValue的参数resultp无效。\n"); 98 return ERROR; 99 } 100 101 p = strstr(queryStr, keyName); //找到键值起始位置 102 p = strchr(p, ‘=‘); 103 keyValueSize = GetItsSize(++ p); 104 105 result = (uChar *)malloc((keyValueSize + 1) * sizeof(uChar)); //申请一段内存来存放键值 106 if(result == NULL) 107 { 108 fprintf(stdout, "内存不足。\n"); 109 exit(EXIT_FAILURE); 110 } 111 112 while((ch = *p) != ‘\0‘ && ch != ‘&‘) //获取有效键值 113 { 114 if(ch == ‘+‘) 115 { 116 result [i] = (uChar)‘ ‘; 117 p ++; 118 } 119 else if(ch == ‘%‘) 120 { 121 result [i] = MergeThem(p[1], p[2]); 122 p += 3; 123 } 124 else 125 { 126 result [i] = (uChar)ch; 127 p ++; 128 } 129 i ++; 130 } 131 result [i] = ‘\0‘; //结尾 132 133 *resultp = result; 134 return OK; 135 }
标签:eof play 符号 eth style 结束 一段 out err
原文地址:http://www.cnblogs.com/the-one/p/7620495.html