先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注go)
正文
举例:
int main(int argc, char *argv[])
{
struct mln_core_attr cattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = NULL;
cattr.worker_process = NULL;
return mln_core_init(&cattr);
}
配置
由于配置文件的加载是在Melon的初始化函数中被自动加载的,因此多数数据结构及函数是无需开发者关心的,这里仅给出开发者所需要的结构定义和函数声明。
在Melon中,配置被划分为两层,每一层为一个域
。最外层为main
域,在main
中允许出现以名称{...}
扩住的子域,然而子域中不允许再出现子域。但在程序中,main
与子域其实为同级关系,而非包含关系。
每个域内是若干配置项
,配置项由配置指令名
与配置参数
组成。
Melon的配置文件melon.conf
会被安装在安装路径下的conf
子目录中。
头文件
#include “mln_conf.h”
相关结构
typedef struct mln_conf_item_s mln_conf_item_t;
struct mln_conf_item_s {
enum {
CONF_NONE = 0,
CONF_STR,
CONF_CHAR,
CONF_BOOL,
CONF_INT,
CONF_FLOAT
} type; //配置项参数类型
union {
mln_string_t *s;
mln_s8_t c;
mln_u8_t b;
mln_sauto_t i;
float f;
} val; //配置项参数数据
};
在Melon中,配置参数
分为5种类型(忽略NONE),分别为:
- 字符串:以
""
扩住的字符集 - 字符:以
''
扩住的字符 - 布尔开关:
on
或off
- 整型:十进制整数
- 浮点型:十进制形式的实数
函数
mln_get_conf
mln_conf_t *mln_get_conf(void);
描述:获取全局配置结构。
返回值:mln_conf_t
指针,若为NULL
,则表明Melon并未进行初始化。
search
typedef mln_conf_domain_t *(*search_domain) (mln_conf_t *, char *);
typedef mln_conf_cmd_t *(*search_cmd) (mln_conf_domain_t *, char *);
typedef mln_conf_item_t *(*search_item) (mln_conf_cmd_t *, mln_u32_t);
描述:
在Melon中,所有配置都会被加载进mln_conf_t
结构中,随后的获取则是通过这三个search函数进行的。这三个search函数指针依次分别为mln_conf_t
,mln_conf_domain_t
以及mln_conf_cmd_t
中的search
成员。故在使用时,则是形如:
mln_conf_domain_t *d = conf->search(conf, “main”);
这三个search函数分别是:
- 从全局
mln_conf_t
中获取某个域结构mln_conf_domain_t
- 从某个域(
mln_conf_domain_t
)中获取对应的配置指令项mln_conf_cmd_t
- 从某个指令(
mln_conf_cmd_t
)中获取某个参数mln_conf_item_t
其中,最后一个search的第二个参数为参数下标,且下标从1
开始而非0
。
在本篇末尾处将给出使用示例。
返回值:
正常情况下,只要所需配置在配置文件中,且配置被正常初始化,那么返回值则必不为NULL
。
mln_conf_set_hook
mln_conf_hook_t *mln_conf_set_hook(reload_handler reload, void *data);
typedef int (*reload_handler)(void *);
描述:
Melon配置支持重载,重载的方式是设置重载回调函数,且允许设置多个。当执行重载时,新配置加载后,将调用这些回调函数。
回调函数的参数即为mln_conf_set_hook
的第二个参数data
。
返回值:
mln_conf_set_hook
:成功返回mln_conf_hook_t
回调句柄,否则返回NULL
。- 回调函数:成功返回
0
,否则返回-1
。
mln_conf_unset_hook
void mln_conf_unset_hook(mln_conf_hook_t *hook);
描述:删除已设置的配置重载回调函数。
返回值:无
mln_conf_get_ncmd
mln_u32_t mln_conf_get_cmdNum(mln_conf_t *cf, char *domain);
描述:获取某个域下配置项的个数。
返回值:配置项个数
mln_conf_get_cmds
void mln_conf_get_cmds(mln_conf_t *cf, char *domain, mln_conf_cmd_t **vector);
描述:获取某个域内的全部配置项,这些配置项将被存放在vector
中,vector
需要在调用前分配好,配置项个数可以通过mln_conf_get_ncmd
预先获取到。
返回值:无
mln_conf_get_narg
mln_u32_t mln_conf_get_argNum(mln_conf_cmd_t *cc);
描述:获取某个配置项的参数个数。
返回值:指令项参数个数
示例
#include <stdio.h>
#include “mln_core.h”
static int global_init(void)
{
mln_conf_t *cf;
mln_conf_domain_t *d;
mln_conf_cmd_t *c;
mln_conf_item_t *i;
cf = mln_get_conf();
d = cf->search(cf, “main”); //如果main都不存在,那说明配追初始化有严重问题
c = d->search(cf, “daemon”); //这里我们获取daemon配置项
if(c == NULL) {
mln_log(error, “daemon not exist.\n”);
return -1;//出错返回
}
i = c->search(c, 1); //daemon在配置文件中只有一个参数,配置参数的下标从1开始
if (i == NULL) {
mln_log(error, “Invalid daemon argument.\n”);
return -1;
}
if (i->type != CONF_BOOL) { //daemon 参数应该为布尔开关量
mln_log(error, “Invalid type of daemon argument.\n”);
return -1;
}
mln_log(debug, “%u\n”, i->val.b); //输出布尔量的值
return 0;
}
int main(int argc, char *argv[])
{
struct mln_core_attr cattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = global_init;
cattr.worker_process = NULL;
return mln_core_init(&cattr);
}
在使用日志输出时,请确保Melon配置及文件中日志文件的父目录路径是否存在。
日志
头文件
#include “mln_log.h”
函数
mln_log
enum log_level {
none,
report,
debug,
warn,
error
};
void _mln_sys_log(enum log_level level, const char *file, const char *func, int line, char *msg, …);
#define mln_log(err_lv,msg,…) _mln_sys_log(err_lv, __FILE__, __FUNCTION__, __LINE__, msg, ## __VA_ARGS__)
描述:
日常开发中,经常被用到的是宏mln_log
,它会将输出日志的文件、函数、行数都自行附加上。
日志分为5个等级,其级别由上至下依次增加。在配置文件中,有一配置项用于控制输出日志的级别,低于该级别的日志将不会进行输出:
log_level “none”;
默认情况下为最低级别none
。
none
与其他级别有所不同,该级别下,所有日志输出的内容完全为msg
的内容,而不带有任何前缀信息,如:日期、进程号、文件名、函数名、行号等。
该函数需要在mln_core_init
之后或其回调函数中使用,在mln_core_init
之前使用将会出错,因为此时日志相关组件尚未被初始化。
字符串
头文件
mln_string.h
主要数据结构
typedef struct {
mln_u8ptr_t data; //数据存放的内存起始地址
mln_u64_t len; //数据字节长度
mln_uauto_t data_ref:1; //data是否是引用
mln_uauto_t pool:1; //本结构是否是由内存池分配
mln_uauto_t ref:30; //本结构所被引用的次数
} mln_string_t;
函数/宏列表
mln_string
mln_string(str)
描述:利用字符串常量str
创建一个mln_string_t
对象。用于定义mln_string_t
变量的同时对其进行初始化。
返回值:mln_string_t
类型结构体
举例:
void foo()
{
mln_string_t s = mln_string(“Hello”);
}
mln_string_set
mln_string_set(pstr, s)
描述:用于将s
这个字符串赋值给pstr
这个mln_string_t
指针所指向的结构。此时,data_ref
成员会被置1。
返回值:无
举例:
void foo()
{
char text[] = “hello”;
mln_string_t s;
mln_string_set(&s, text);
}
mln_string_nset
mln_string_nset(pstr, s, n)
描述:与mln_string_set
功能一样,只是pstr
所指向的mln_string_t
仅记录了s
的前n
个字节。
返回值:无
举例:
void foo()
{
char text[] = “hello world”;
mln_string_t s;
mln_string_nset(&s, text, 5); //利用mln_log的%S进行输出时,仅会输出hello
}
mln_string_ref
mln_string_ref(pstr)
描述:将pstr
所指向的mln_string_t
结构的ref
成员累加1,用于直接引用pstr
这个内存结构。在释放内存时,引用计数大于1时是不会实际释放内存的。
返回值:mln_string_t
类型指针
void foo(mln_string_t s)
{
mln_string_t *ref = mln_string_ref(s); //此时ref与s的内存地址完全相同
…
}
mln_string_free
mln_string_free(pstr)
描述:释放ptrs
所指向的mln_string_t
结构内存,若ref
大于1则仅递减引用计数,若data_ref
为1,则不释放data
成员指向的内存,否则释放data
成员内存,随后释放pstr
内存。释放时,会根据pool
成员判断是释放回内存池,还是返还malloc库。
返回值:无
mln_string_new
mln_string_t *mln_string_new(const char *s);
描述:根据字符串常量s
创建字符串结构,此时新字符串结构及其数据部分内存均由malloc库进行分配,并将s
的内容拷贝进data
成员中。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_pool_new
mln_string_t *mln_string_pool_new(mln_alloc_t *pool, const char *s);
描述:与mln_string_new
功能一致,仅内存是由pool
所指向的内存池中分配而来。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_dup
mln_string_t *mln_string_dup(mln_string_t *str);
描述:完全复制一份str
,其内存均由malloc进行分配。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_pool_dup
mln_string_t *mln_string_pool_dup(mln_alloc_t *pool, mln_string_t *str);
描述:与mln_string_dup
功能一致,仅内存是从pool
所指向的内存池中分配而来。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_ndup
mln_string_t *mln_string_ndup(mln_string_t *str, mln_s32_t size);
描述:创建一个新字符串对象,并仅复制str
中前size
个字节数据。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_const_ndup
mln_string_t *mln_string_const_ndup(char *str, mln_s32_t size);
描述:创建一个新字符串对象,并仅复制str
中前size
个字节数据。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_ref_dup
mln_string_t *mln_string_ref_dup(mln_string_t *str);
描述:创建一个新的字符串结构,但结构中的data
成员指向str
中data
成员所指向的地址,且新结构中data_ref
会被置位。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_const_ref_dup
mln_string_t *mln_string_const_ref_dup(char *s);
描述:创建一个新的字符串结构,但结构中的data
成员指向s
,且新结构中data_ref
会被置位。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_strseqcmp
int mln_string_strseqcmp(mln_string_t *s1, mln_string_t *s2);
描述:比较s1
与s2
的数据,如果短的一方刚好与长的一方的前面完全匹配,则长的一方大于短的一方。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
举例:
int main(void)
{
mln_string_t s1 = mln_string(“abcd”);
mln_string_t s2 = mln_string(“abcdefg”);
printf(“%d”, mln_string_strseqcmp(&s1, &s2)); //-1
return 0;
}
mln_string_strcmp
int mln_string_strcmp(mln_string_t *s1, mln_string_t *s2);
描述:比较s1
与s2
中数据的大小。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_const_strcmp
int mln_string_const_strcmp(mln_string_t *s1, char *s2);
描述:比较s1
所记录的数据与s2
的大小。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_strncmp
int mln_string_strncmp(mln_string_t *s1, mln_string_t *s2, mln_u32_t n);
描述:比较s1
与s2
的前n
个字节的大小。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_const_strncmp
int mln_string_const_strncmp(mln_string_t *s1, char *s2, mln_u32_t n);
描述:比较s1
所记录的数据与s2
的前n
个字节的大小。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_strcasecmp
int mln_string_strcasecmp(mln_string_t *s1, mln_string_t *s2);
描述:比较s1
与s2
数据的大小,且忽略大小写。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_const_strcasecmp
int mln_string_const_strcasecmp(mln_string_t *s1, char *s2);
描述:比较s1
所记录的数据与s2
的大小,且忽略大小写。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_const_strncasecmp
int mln_string_const_strncasecmp(mln_string_t *s1, char *s2, mln_u32_t n);
描述:比较s1
所记录的数据与s2
的前n
个字节的大小,且忽略大小写。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_strncasecmp
int mln_string_strncasecmp(mln_string_t *s1, mln_string_t *s2, mln_u32_t n);
描述:比较s1
与s2
所记录数据的前n
个字节的大小,且忽略大小写。
返回值:
- -1 -
s1
比s2
小 - 1 -
s1
比s2
大 - 0 - 二者相同
mln_string_strstr
char *mln_string_strstr(mln_string_t *text, mln_string_t *pattern);
描述:匹配text
所记录的数据中与pattern
中数据一样的起始地址。
返回值:若匹配成功,则返回text
的data
成员所指向地址中的对应地址;否则返回NULL
。
mln_string_const_strstr
char *mln_string_const_strstr(mln_string_t *text, char *pattern);
描述:匹配text
所记录的数据中与pattern
一样的起始地址。
返回值:若匹配成功,则返回text
的data
成员所指向地址中的对应地址;否则返回NULL
。
mln_string_new_strstr
mln_string_t *mln_string_new_strstr(mln_string_t *text, mln_string_t *pattern);
描述:与mln_string_strstr
功能一致,但返回的是由mln_string_t
结构包装后的字符串。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_new_const_strstr
mln_string_t *mln_string_new_const_strstr(mln_string_t *text, char *pattern);
描述:与mln_string_const_strstr
功能一致,但返回的是由mln_string_t
结构包装后的字符串。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_kmp
char *mln_string_kmp(mln_string_t *text, mln_string_t *pattern);
描述:与mln_string_strstr
功能一致,但是是由KMP算法实现的。KMP算法适用场景是,text
中有较多与pattern
前缀相同的字符串的情况。例如: text
中包含aaaaaaaaaabc
,pattern
中包含ab
,此时,KMP算法性能将高于朴素算法。
返回值:若匹配成功,则返回text
的data
成员所指向地址中的对应地址;否则返回NULL
。
mln_string_const_kmp
char *mln_string_const_kmp(mln_string_t *text, char *pattern);
描述:与mln_string_kmp
功能一致,但pattern
为字符指针类型。
返回值:若匹配成功,则返回text
的data
成员所指向地址中的对应地址;否则返回NULL
。
mln_string_new_kmp
mln_string_t *mln_string_new_kmp(mln_string_t *text, mln_string_t *pattern);
描述:与mln_string_kmp
功能一致,但返回的是由mln_string_t
结构包装后的数据。
返回值:成功则返回mln_string_t
指针,失败则返回NULL
。
mln_string_new_const_kmp
mln_string_t *mln_string_new_const_kmp(mln_string_t *text, char *pattern);
描述:与mln_string_const_kmp
功能一致,但返回的是由mln_string_t
结构包装后的数据。
返回值:成功则返回mln_string_t
指针,失败则返回NULL
。
mln_string_slice
mln_string_t *mln_string_slice(mln_string_t *s, const char *sep_array/ended by \0/);
描述:seq_array
是一个字符数组且以0结尾,该数组的每一个字符都是一个分隔标志。函数会扫描s
的数据部分,当数据中遇到seq_array
中的任意一个字符时都会被进行分割,连续遇到多个时仅分割一次,且分割后,分隔符不会出现在被分割后的字符串中。
返回值:成功则返回mln_string_t
数组,否则返回NULL
。数组的最后一个元素的len
为0
,且data
为NULL
。
举例:
int main(void)
{
mln_string_t s = mln_string(“abc-def-=ghi”);
mln_string_t *str, *arr = mln_string_slice(&s, “-=”);
for (str = arr; str->data != NULL; ++str) {
mln_log(debug, “%S”, str);
}
mln_string_slice_free(arr);
return 0;
}
mln_string_slice_free
void mln_string_slice_free(mln_string_t *array);
描述:释放由mln_string_slice
函数创建的mln_string_t
数组。
返回值:无
mln_string_strcat
mln_string_t *mln_string_strcat(mln_string_t *s1, mln_string_t *s2);
描述:创建一个新的mln_string_t
结构,其数据为s1
和s2
依此顺序拼接后的结果。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
mln_string_pool_strcat
mln_string_t *mln_string_pool_strcat(mln_alloc_t *pool, mln_string_t *s1, mln_string_t *s2);
描述:与mln_string_strcat
功能一致,仅新的结构所使用内存由pool
指向的内存池分配。
返回值:成功则返回mln_string_t
指针,否则返回NULL
。
双向链表
头文件
#include “mln_defs.h”
函数/宏
MLN_CHAIN_FUNC_DECLARE
MLN_CHAIN_FUNC_DECLARE(prefix,type,ret_attr,func_attr);
描述:本宏用于对双向链表的添加操作和删除操作函数进行声明,其中:
prefix
:为两个函数名的前缀,这是为了允许在一个源文件内为多个双向链表进行函数声明。type
:链表节点的类型ret_attr
:两个函数的操作域类型和返回值类型func_attr
:对函数参数的约束(仅限于Linux中),若无则留空即可
MLN_CHAIN_FUNC_DEFINE
MLN_CHAIN_FUNC_DEFINE(prefix,type,ret_attr,prev_ptr,next_ptr);
ret_attr prefix##_chain_add(type **head, type **tail, type *node);
ret_attr prefix##_chain_del(type **head, type **tail, type *node);
描述:本宏用于定义双向链表的添加和删除操作函数,其中:
prefix
:为两个函数名的前缀,这是为了允许在一个源文件内为多个双向链表进行函数声明。type
:链表节点的类型ret_attr
:两个函数的操作域类型和返回值类型prev_ptr
:链表节点中指向前一节点的指针名next_ptr
:链表节点中指向后一节点的指针名
chain_add
和chain_del
分别为添加和删除节点函数,两个函数的参数为:
head
:二级指针,用于在操作函数内对头指针自动修改tail
:二级指针,用于在操作函数内对尾指针自动修改node
:被加入的节点指针,其前后指向的指针可能会被修改
示例
#include <stdio.h>
#include <stdlib.h>
#include “mln_defs.h”
typedef struct chain_s {
int val;
struct chain_s *prev;
struct chain_s *next;
} chain_t;
MLN_CHAIN_FUNC_DECLARE(test, chain_t, static inline void, );
MLN_CHAIN_FUNC_DEFINE(test, chain_t, static inline void, prev, next);
int main(void)
{
int i;
chain_t *head = NULL, *tail = NULL, *c;
for (i = 0; i < 10; ++i) {
c = (chain_t *)malloc(sizeof(chain_t));
if (c == NULL) {
fprintf(stderr, “malloc failed.\n”);
return -1;
}
c->val = i;
c->prev = c->next = NULL;
test_chain_add(&head, &tail, c);
}
for (c = head; c != NULL; c = c->next) {
printf(“%d\n”, c->val);
}
return 0;
}
栈
头文件
#include “mln_stack.h”
函数/宏
mln_stack_init
mln_stack_t *mln_stack_init(struct mln_stack_attr *attr);
struct mln_stack_attr {
stack_free free_handler;//栈节点数据释放函数
stack_copy copy_handler;//栈节点数据复制函数
mln_u32_t cache:1;//是否缓存栈节点结构
};
typedef void (*stack_free)(void *);
typedef void *(*stack_copy)(void *, void *);
描述:
初始化栈结构。
free_handler
:是入栈数据的释放函数,由于入栈数据可能为自定义数据结构,因此若需释放,可对此进行设置否则置NULL
。
copy_handler
:复制栈节点数据。
cache
:是否缓存全部栈节点结构内存以提升效率(非用户数据)。
stack_free
的参数为用户自定义数据的数据结构指针。
stack_copy
的参数分别为:被复制的栈节点数据的数据结构指针 和 mln_stack_dup
函数的第二个参数(即用户自定义数据),这个回调函数仅在mln_stack_dup
函数中被调用。
返回值:成功则返回栈指针,否则为NULL
mln_stack_destroy
void mln_stack_destroy(mln_stack_t *st);
描述:销毁栈结构,并释放栈节点内数据资源。
返回值:无
mln_stack_push
int mln_stack_push(mln_stack_t *st, void *data);
描述:将数据data
压入栈st
中。
返回值:成功返回0
,否则返回-1
mln_stack_pop
void *mln_stack_pop(mln_stack_t *st);
描述:将栈st
的栈顶元素数据弹出。
返回值:若栈内无元素则为NULL
,否则为栈节点内的数据指针
mln_stack_empty
mln_stack_empty(s)
描述:判断栈是否为空。
返回值:空为非0
,否则为0
mln_stack_top
mln_stack_top(st)
描述:获取栈顶元素数据。
返回值:若栈st
为空则返回NULL
,否则为栈顶节点内的数据指针
mln_stack_dup
mln_stack_t *mln_stack_dup(mln_stack_t *st, void *udata);
描述:完全复制栈st
。udata
为用户提供的额外数据。
返回值:若成功则返回新栈指针,否则返回NULL
mln_stack_scan_all
int mln_stack_scan_all(mln_stack_t *st, stack_scan scanner, void *data);
typedef int (*stack_scan)(void *, void *);
描述:
从栈顶向栈底遍历栈st
的每一个栈内元素数据。scanner
为数据访问函数,data
为遍历时的额外用户数据。
stack_scan
有两个参数,分别为:栈节点内数据指针 和 data
参数。
返回值:
mln_stack_scan_all
:全部遍历完则返回0
,否则返回-1
stack_scan
:若想中断遍历则返回小于0
的值,否则返回值大于等于0
队列
头文件
#include “mln_queue.h”
函数/宏
mln_queue_init
mln_queue_t *mln_queue_init(struct mln_queue_attr *attr);
struct mln_queue_attr {
mln_uauto_t qlen; //队列长度
queue_free free_handler; //队列节点数据的释放函数
};
typedef void (*queue_free)(void *);
描述:创建队列。
本队列为固定长度队列,因此attr.qlen
就是队列的长度。free_handler
为释放函数,用于释放队列内每个成员中的数据。若不需要释放则置NULL
即可。
释放函数的参数即为队列每个成员的数据结构指针。
返回值:成功则返回mln_queue_t
类型的队列指针,失败则返回NULL
mln_queue_destroy
void mln_queue_destroy(mln_queue_t *q);
描述:销毁队列。
队列销毁时,会根据free_handler
的设置而自动释放队列成员的数据。
返回值:无
mln_queue_append
int mln_queue_append(mln_queue_t *q, void *data);
描述:将数据data
追加进队列q
的末尾。
返回值:若队列已满则返回-1
,成功返回0
mln_queue_get
void *mln_queue_get(mln_queue_t *q);
描述:获取队首成员的数据。
返回值:成功则返回数据指针,若队列为空则返回NULL
mln_queue_remove
void mln_queue_remove(mln_queue_t *q);
描述:删除队首元素,但不释放资源。
返回值:无
mln_queue_search
void *mln_queue_search(mln_queue_t *q, mln_uauto_t index);
描述:查找并返回从队列q
队首开始的第index
成员的数据,下标从0开始。
返回值:成功则返回数据指针,否则为NULL
mln_queue_free_index
void mln_queue_free_index(mln_queue_t *q, mln_uauto_t index);
描述:释放队列q
内指定下标index
的成员,并根据free_handler
释放其数据。
返回值:无
mln_queue_scan_all
int mln_queue_scan_all(mln_queue_t *q, queue_scan scan_handler, void *udata);
typedef int (*queue_scan)(void *, void *);
描述:遍历每一个队列成员。
udata
为辅助遍历的自定义结构指针,若不需要可置NULL
。
scan_handler
的两个参数分别为:成员数据
,udata
。
返回值:遍历完成返回0
,被中断则返回-1
mln_queue_empty
mln_queue_empty(q)
描述:判断队列q
是否为空队列。
返回值:空则为非0
,否则为0
mln_queue_full
mln_queue_full(q)
描述:判断队列是否已满。
返回值:满则为非0
,否则为0
mln_queue_length
mln_queue_length(q)
描述:获取队列q
的总长度。
返回值:无符号整型长度值
mln_queue_element
mln_queue_element(q)
描述:获取队列q
中当前的成员数量。
返回值:无符号整型数量值
示例
#include <stdio.h>
#include <stdlib.h>
#include “mln_core.h”
#include “mln_log.h”
#include “mln_queue.h”
int main(int argc, char *argv[])
{
int i = 10;
mln_queue_t *q;
struct mln_queue_attr qattr;
struct mln_core_attr cattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = NULL;
cattr.worker_process = NULL;
if (mln_core_init(&cattr) < 0) {
fprintf(stderr, “init failed\n”);
return -1;
}
qattr.qlen = 10;
qattr.free_handler = NULL;
q = mln_queue_init(&qattr);
if (q == NULL) {
mln_log(error, “queue init failed.\n”);
return -1;
}
mln_queue_append(q, &i);
mln_log(debug, “%d\n”, *(int *)mln_queue_get(q));
mln_queue_destroy(q);
return 0;
}
内存池
Melon中,内存池分为两类:
- 堆内存
- 共享内存
其中,共享内存内存池只允许主子进程之间共享数据(兄弟进程之间也共享)。即使用时,由主进程创建共享内存内存池,然后创建子进程。
头文件
#include “mln_alloc.h”
函数
mln_alloc_init
mln_alloc_t *mln_alloc_init(void);
描述:创建堆内存内存池。
返回值:成功则返回内存池结构指针,否则返回NULL
mln_alloc_shm_init
mln_alloc_t *mln_alloc_shm_init(mln_size_t size);
描述:创建共享内存内存池。本池建立时需要给出池大小size
(单位字节),一旦创建完毕后则后续无法再扩大。
返回值:成功则返回内存池结构指针,否则返回NULL
mln_alloc_destroy
void mln_alloc_destroy(mln_alloc_t *pool);
描述:销毁内存池。销毁操作会将内存池中管理的所有内存进行统一释放。
返回值:无
mln_alloc_m
void *mln_alloc_m(mln_alloc_t *pool, mln_size_t size);
描述:从内存池pool
中分配一个size
大小的内存。如果内存池是共享内存内存池,则会从共享内存中进行分配,否则从堆内存中进行分配。
返回值:成功则返回内存起始地址,否则返回NULL
mln_alloc_c
void *mln_alloc_c(mln_alloc_t *pool, mln_size_t size);
描述:从内存池pool
中分配一个size
大小的内存,且该内存会被清零。
返回值:成功则返回内存起始地址,否则返回NULL
mln_alloc_re
void *mln_alloc_re(mln_alloc_t *pool, void *ptr, mln_size_t size);
描述:从内存池pool
中分配一个size
大小的内存,并将ptr
指向的内存中的数据拷贝到新的内存中。
ptr
必须为内存池分配的内存起始地址。若size
为0
,ptr
指向的内存会被释放。
返回值:成功则返回内存起始地址,否则返回NULL
mln_alloc_free
void mln_alloc_free(void *ptr);
描述:释放ptr
指向的内存。注意:ptr
必须为分配函数返回的地址,而不可以是分配的内存中某一个位置。
返回值:无
mln_alloc_shm_rdlock
int mln_alloc_shm_rdlock(mln_alloc_t *pool);
描述:读锁定。本函数会等待直到锁资源可用,并将之锁定。
本函数及后续锁相关函数均用于共享内存内存池。
出于对读多写少的场景考虑,给共享内存配备的是读写锁,而非互斥锁。
返回值:成功返回0
,否则返回非0
mln_alloc_shm_tryrdlock
int mln_alloc_shm_tryrdlock(mln_alloc_t *pool);
描述:尝试读锁定。本函数不会挂起等待锁资源可用。
返回值:成功返回0
,否则返回非0
mln_alloc_shm_wrlock
int mln_alloc_shm_wrlock(mln_alloc_t *pool);
描述:写锁定。本函数会等待直到锁资源可用,并将之锁定。
返回值:成功返回0
,否则返回非0
mln_alloc_shm_trywrlock
int mln_alloc_shm_trywrlock(mln_alloc_t *pool);
描述:尝试写锁定。本函数不会挂起等待锁资源可用。
返回值:成功返回0
,否则返回非0
mln_alloc_shm_unlock
int mln_alloc_shm_unlock(mln_alloc_t *pool);
描述:解除锁定。
返回值:成功返回0
,否则返回非0
示例
#include <stdio.h>
#include <stdlib.h>
#include “mln_core.h”
#include “mln_log.h”
#include “mln_alloc.h”
int main(int argc, char *argv[])
{
char *p;
mln_alloc_t *pool;
struct mln_core_attr cattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = NULL;
cattr.worker_process = NULL;
if (mln_core_init(&cattr) < 0) {
fprintf(stderr, “init failed\n”);
return -1;
}
pool = mln_alloc_init();
if (pool == NULL) {
mln_log(error, “pool init failed\n”);
return -1;
}
p = (char *)mln_alloc_m(pool, 6);
if (p == NULL) {
mln_log(error, “alloc failed\n”);
return -1;
}
memcpy(p, “hello”, 5);
p[5] = 0;
mln_log(debug, “%s\n”, p);
mln_alloc_free§;
return 0;
}
线程池
在Melon中支持两种多线程模式,线程池是其中一种,另一种请参见后续的多线程框架文章。
注意:在每个进程中仅允许存在一个线程池。
头文件
#include “mln_thread_pool.h”
函数
mln_thread_pool_run
int mln_thread_pool_run(struct mln_thread_pool_attr *tpattr);
struct mln_thread_pool_attr {
void *main_data;
mln_thread_process child_process_handler;
mln_thread_process main_process_handler;
mln_thread_dataFree free_handler;
mln_u64_t cond_timeout; /*ms*/
mln_u32_t max;
mln_u32_t concurrency;
};
typedef int (*mln_thread_process)(void *);
typedef void (*mln_thread_dataFree)(void *);
描述:创建并运行内存池。
线程池由主线程进行管理和做一部分处理后下发任务,子线程组则接受任务进行处理。
初始状态下,是不存在子线程的,当有任务需要下发时会自动创建子线程。当任务处理完后,子线程会延迟释放,避免频繁分配释放资源。
其中参数结构体的每个成员含义如下:
main_data
为主线程的用户自定义数据。child_process_handler
每个子线程的处理函数,该函数有一个参数为主线程下发任务时给出的数据结构指针,返回值为0
表示处理正常,非0
表示处理异常,异常时会有日志输出。main_process_handler
主线程的处理函数,该函数有一个参数为main_data
,返回值为0
表示处理正常,非0
表示处理异常,异常时会有日志输出。一般情况下,主线程处理函数不应随意自行返回,一旦返回代表线程池处理结束,线程池会被销毁。free_handler
为资源释放函数。其资源为主线程下发给子线程的数据结构指针所指向的内容。cond_timeout
为闲置子线程回收定时器,单位为毫秒。当子线程无任务处理,且等待时间超过该定时器时长后,会自行退出。max
线程池允许的最大子线程数量。concurrency
用于pthread_setconcurrency
设置并行级别参考值,但部分系统并为实现该功能,因此不应该过多依赖该值。在Linux下,该值设为零表示交由本系统实现自行确定并行度。
返回值:本函数返回值与主线程处理函数的返回值保持一致
mln_thread_pool_addResource
int mln_thread_pool_addResource(void *data);
描述:将资源data
放入到资源池中。本函数仅应由主线程调用,用于主线程向子线程下发任务所用。
返回值:成功则返回0
,否则返回非0
mln_thread_quit
void mln_thread_quit(void);
描述:本函数用于告知线程池,关闭并销毁线程池。
返回值:无
mln_thread_ResourceInfo
void mln_thread_ResourceInfo(struct mln_thread_pool_info *info);
struct mln_thread_pool_info {
mln_u32_t max_num;
mln_u32_t idle_num;
mln_u32_t cur_num;
mln_size_t res_num;
};
描述:获取当前线程池信息。信息会写入参数结构体中,结构体每个参数含义如下:
max_num
:线程池最大子线程数量idle_num
:当前闲置子线程数量cur_num
:当前子线程数量(包含闲置和工作中的子线程)res_num
:当前尚未被处理的资源数量
返回值:无
示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include “mln_core.h”
#include “mln_thread_pool.h”
#include “mln_log.h”
static int main_process_handler(void *data);
static int child_process_handler(void *data);
static void free_handler(void *data);
int main(int argc, char *argv[])
{
struct mln_core_attr cattr;
struct mln_thread_pool_attr tpattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = NULL;
cattr.worker_process = NULL;
if (mln_core_init(&cattr) < 0) {
return -1;
}
tpattr.dataForMain = NULL;
tpattr.child_process_handler = child_process_handler;
tpattr.main_process_handler = main_process_handler;
tpattr.free_handler = free_handler;
tpattr.condTimeout = 10;
tpattr.max = 10;
tpattr.concurrency = 10;
return mln_thread_pool_run(&tpattr);
}
static int child_process_handler(void *data)
{
mln_log(none, “%s\n”, (char *)data);
return 0;
}
static int main_process_handler(void *data)
{
int n;
char *text;
while (1) {
if ((text = (char *)malloc(16)) == NULL) {
return -1;
}
n = snprintf(text, 15, “hello world”);
text[n] = 0;
mln_thread_pool_addResource(text);
usleep(1000);
}
}
static void free_handler(void *data)
{
free(data);
}
JSON
头文件
#include “mln_json.h”
函数/宏
mln_json_new
mln_json_t *mln_json_new(void);
描述:新建json节点,用于生成json字符串之用。
返回值:成功则返回mln_json_t
指针,否则返回NULL
mln_json_parse
mln_json_t *mln_json_parse(mln_string_t *jstr);
描述:将JSON字符串jstr
解析成数据结构。
返回值:成功则返回mln_json_t
指针,否则返回NULL
mln_json_free
void mln_json_free(void *json);
描述:释放mln_json_t
类型的json
节点内存。
返回值:无
mln_json_dump
void mln_json_dump(mln_json_t *j, int n_space, char *prefix);
描述:将json节点j
的详细信息输出到标准输出。n_space
表示当前缩进空格数,prefix
为输出内容的前缀。
返回值:无
mln_json_generate
mln_string_t *mln_json_generate(mln_json_t *j);
描述:由mln_json_t
节点结构生成JSON字符串。
返回值:成功返回mln_string_t
字符串指针,否则返回NULL
mln_json_search_value
mln_json_t *mln_json_search_value(mln_json_t *j, mln_string_t *key);
描述:从节点j
中搜索key为key
的value内容。此时,j
必须为对象类型(有key: value对的字典)。
返回值:成功则返回mln_json_t
类型的value,否则返回NULL
mln_json_search_element
mln_json_t *mln_json_search_element(mln_json_t *j, mln_uauto_t index);
描述:从节点j
中搜索下标为index
的元素内容。此时,j
必须为数组类型。
返回值:成功则返回mln_json_t
类型的元素节点,否则返回NULL
mln_json_get_array_length
mln_uauto_t mln_json_get_array_length(mln_json_t *j);
描述:获取数组的长度。此时j
必须为数组类型。
返回值:数组长度
mln_json_update_obj
int mln_json_update_obj(mln_json_t *j, mln_json_t *key, mln_json_t *val);
描述:将key
与val
对添加到j
JSON节点中。此时,j
需为对象类型。若key
已经存在,则将原本value替换为val
。
返回值:成功则返回0
,否则返回-1
mln_json_add_element
int mln_json_add_element(mln_json_t *j, mln_json_t *value);
描述:将value
加入到数组类型的JSON结构j
中。
返回值:成功则返回0
,否则返回-1
mln_json_update_element
int mln_json_update_element(mln_json_t *j, mln_json_t *value, mln_uauto_t index);
描述:将value
更新到数组类型JSON结构j
的下标为index
的位置上。
返回值:成功则返回0
,否则返回-1
mln_json_reset
void mln_json_reset(mln_json_t *j);
描述:重置JSON节点j
数据结构,将其内存进行释放。
返回值:无
mln_json_remove_object
mln_json_t *mln_json_remove_object(mln_json_t *j, mln_string_t *key);
描述:将key值为key
的键值对从对象类型的JSON结构j
中删除,并将相应value返回。
返回值:存在则返回对应value部分的JSON节点,否则返回NULL
mln_json_remove_element
mln_json_t *mln_json_remove_element(mln_json_t *j, mln_uauto_t index);
描述:将下标为index
的元素从数组类型JSON节点上删除并返回。
返回值:存在则返回元素指针,否则返回NULL
is_type
M_JSON_IS_OBJECT(json)
M_JSON_IS_ARRAY(json)
M_JSON_IS_STRING(json)
M_JSON_IS_NUMBER(json)
M_JSON_IS_TRUE(json)
M_JSON_IS_FALSE(json)
M_JSON_IS_NULL(json)
M_JSON_IS_NONE(json)
描述:判断mln_json_t
结构的json
类型,依次分别为:对象、数组、字符串、数字、布尔真、布尔假、NULL、无类型。
返回值:满足条件返回非0
,否则返回0
set_type
M_JSON_SET_TYPE_NONE(json)
M_JSON_SET_TYPE_OBJECT(json)
M_JSON_SET_TYPE_ARRAY(json)
M_JSON_SET_TYPE_STRING(json)
M_JSON_SET_TYPE_NUMBER(json)
M_JSON_SET_TYPE_TRUE(json)
M_JSON_SET_TYPE_FALSE(json)
M_JSON_SET_TYPE_NULL(json)
描述:给mln_json_t
类型的json
节点设置类型,依次分别为:无类型、对象、数组、字符串、数字、布尔真、布尔假、NULL。
返回值:无
get_data
M_JSON_GET_DATA_OBJECT(json)
M_JSON_GET_DATA_ARRAY(json)
M_JSON_GET_DATA_STRING(json)
M_JSON_GET_DATA_NUMBER(json)
M_JSON_GET_DATA_TRUE(json)
M_JSON_GET_DATA_FALSE(json)
M_JSON_GET_DATA_NULL(json)
描述:获取mln_json_t
类型的json
节点中对应类型的数据部分。类型依次为:对象、数组、字符串、数字、布尔真、布尔假、NULL。
返回值:
- 对象类型为
mln_hash_t
类型指针 - 数组类型为
mln_rbtree_t
类型指针 - 字符串类型为
mln_string_t
类型指针 - 数字类型为
double
类型值 - 布尔真为
mln_u8_t
类型值 - 布尔假为
mln_u8_t
类型值 - NULL类型为
mln_u8ptr_t
类型的NULL值
set_data
M_JSON_SET_DATA_STRING(json,str)
M_JSON_SET_DATA_NUMBER(json,num)
M_JSON_SET_DATA_TRUE(json)
M_JSON_SET_DATA_FALSE(json)
M_JSON_SET_DATA_NULL(json)
描述:给不同类型的JSON节点json
设置数据值。对象和数组类型分别使用哈希表和红黑树函数进行操作,其余类型用上述宏进行设置。
注意:这里设置的字符串必须是从内存池或堆中分配的内存,栈中内存会出现段错误,因为赋值时不会在宏内自动复制一份而是直接使用。
返回值:无
M_JSON_SET_INDEX
M_JSON_SET_INDEX(json,i)
描述:设置mln_json_t
类型节点json
的下标为index
。该宏用于生成JSON字符串中数组的部分。
返回值:无
示例
#include <stdio.h>
#include <stdlib.h>
#include “mln_core.h”
#include “mln_log.h”
#include “mln_string.h”
#include “mln_json.h”
int main(int argc, char *argv[])
{
mln_json_t *j = NULL, *key = NULL, *val = NULL;
mln_string_t s1 = mln_string(“name”);
mln_string_t s2 = mln_string(“Tom”);
mln_string_t *res;
struct mln_core_attr cattr;
cattr.argc = argc;
cattr.argv = argv;
cattr.global_init = NULL;
cattr.worker_process = NULL;
if (mln_core_init(&cattr) < 0) {
fprintf(stderr, “init failed\n”);
return -1;
}
key = mln_json_new();
if (key == NULL) {
mln_log(error, “init key failed\n”);
goto err;
}
M_JSON_SET_TYPE_STRING(key);
M_JSON_SET_DATA_STRING(key, mln_string_dup(&s1));//注意,一定是要自行分配内存,不可直接使用栈中内存
val = mln_json_new();
if (val == NULL) {
mln_log(error, “init val failed\n”);
goto err;
}
M_JSON_SET_TYPE_STRING(val);
M_JSON_SET_DATA_STRING(val, mln_string_dup(&s2));//注意,一定是要自行分配内存,不可直接使用栈中内存
j = mln_json_new();
if (j == NULL) {
mln_log(error, “init object failed\n”);
goto err;
}
if (mln_json_update_obj(j, key, val) < 0) {
mln_log(error, “update object failed\n”);
goto err;
}
key = val = NULL;
res = mln_json_generate(j);
mln_json_free(j);
if (res == NULL) {
mln_log(error, “generate failed\n”);
goto err;
}
mln_log(debug, “%S\n”, res);
j = mln_json_parse(res);
mln_string_free(res);
mln_json_dump(j, 0, NULL);
mln_json_free(j);
return 0;
err:
if (j != NULL) mln_json_free(j);
if (key != NULL) mln_json_free(key);
if (val != NULL) mln_json_free(val);
return -1;
}
HTTP
头文件
#include “mln_http.h”
函数/宏
mln_http_init
mln_http_t *mln_http_init(mln_tcp_conn_t *connection, void *data, mln_http_handler body_handler);
typedef int (*mln_http_handler)(mln_http_t *, mln_chain_t **, mln_chain_t **);
描述:创建并初始化mln_http_t
结构。connection
是TCP结构,内含TCP套接字。data
为体处理函数的用户自定义数据部分,用于辅助请求或响应体的处理。body_handler
是体处理函数,该函数会在每次调用mln_http_parse
或mln_http_generate
函数时被调用。体处理函数有三个参数,分别为:http结构,用于解析或生成HTTP报文的双向链表的头和尾节点。
返回值:成功则返回mln_http_t
结构指针,否则返回NULL
mln_http_destroy
void mln_http_destroy(mln_http_t *http);
描述:销毁http
结构并释放资源。
返回值:无
mln_http_reset
void mln_http_reset(mln_http_t *http);
描述:重置http
结构,但不会将结构释放,可用于下一次处理。
返回值:无
mln_http_parse
int mln_http_parse(mln_http_t *http, mln_chain_t **in);
描述:用于解析HTTP报文,并将解析的结果写入http
中。
返回值:
M_HTTP_RET_DONE
解析完成M_HTTP_RET_OK
解析未完成但未出错,继续传入新的数据使解析完成M_HTTP_RET_ERROR
解析失败
mln_http_generate
int mln_http_generate(mln_http_t *http, mln_chain_t **out_head, mln_chain_t **out_tail);
描述:将http
中HTTP相关信息生成HTTP报文。报文可能不会一次性生成完全,因此可以多次调用。已生成的报文将会存放在out_head
和out_tail
指定的双向链表中。
返回值:
M_HTTP_RET_DONE
生成完成M_HTTP_RET_OK
生成未完成但未出错M_HTTP_RET_ERROR
生成失败
mln_http_set_field
int mln_http_set_field(mln_http_t *http, mln_string_t *key, mln_string_t *val);
描述:设置HTTP头字段。若头字段key
存在,则会将val
替换原有值。
返回值:
M_HTTP_RET_OK
处理成功M_HTTP_RET_ERROR
处理失败
mln_http_get_field
mln_string_t *mln_http_get_field(mln_http_t *http, mln_string_t *key);
描述:获取HTTP头字段中键为key
的值。
返回值:成功则返回值字符串结构指针,否则返回NULL
mln_http_field_iterator
mln_string_t *mln_http_field_iterator(mln_http_t *http, mln_string_t *key);
描述:每次返回一个键为key
的头字段值(即假设存在多个相同键名的头字段)。
返回值:成功则返回值字符串结构指针,否则返回NULL
mln_http_drop_field
void mln_http_drop_field(mln_http_t *http, mln_string_t *key);
描述:移除头字段key
及其值。
返回值:无
mln_http_dump
void mln_http_dump(mln_http_t *http);
描述:将HTTP信息输出到标准输出,用于调试之用。
返回值:无
mln_http_get_connection
mln_http_get_connection(h)
描述:获取类型为mln_http_t
的h
中TCP链接结构。
返回值:mln_tcp_conn_t
类型指针
mln_http_set_connection
mln_http_set_connection(h,c)
描述:将mln_http_t
类型的h
中TCP链接结构设置为mln_tcp_conn_t
类型的c
。
返回值:无
mln_http_get_pool
mln_http_get_pool(h)
描述:获取类型为mln_http_t
的h
中内存池结构。
返回值:mln_alloc_t
类型指针
mln_http_set_pool
mln_http_set_pool(h,p)
描述:将mln_http_t
类型的h
中内存池设置为mln_alloc_t
类型的p
。
返回值:无
mln_http_get_data
mln_http_get_data(h)
描述:获取类型为mln_http_t
的h
中辅助体处理函数的用户自定义数据。
返回值:用户自定义数据指针
mln_http_set_data
mln_http_set_data(h,d)
描述:将mln_http_t
类型的h
中辅助体处理函数的用户自定义数据设置为d
。
返回值:无
mln_http_get_uri
mln_http_get_uri(h)
描述:获取类型为mln_http_t
的h
中URI字符串。
返回值:mln_string_t
类型指针
mln_http_set_uri
mln_http_set_uri(h,u)
描述:将mln_http_t
类型的h
中URI设置为mln_string_t
类型指针的u
。
返回值:无
mln_http_get_args
mln_http_get_args(h)
描述:获取类型为mln_http_t
的h
中参数字符串。
返回值:mln_string_t
类型指针
mln_http_set_args
mln_http_set_args(h,a)
描述:将mln_http_t
类型的h
中参数设置为mln_string_t
类型指针的a
。
返回值:无
mln_http_get_status
mln_http_get_status(h)
描述:获取类型为mln_http_t
的h
中响应状态字,例如200 400等。
返回值:整型状态字
mln_http_set_status
mln_http_set_status(h,s)
描述:将mln_http_t
类型的h
中响应状态字设置为整型的s
。
返回值:无
mln_http_get_method
mln_http_get_method(h)
描述:获取类型为mln_http_t
的h
中方法字段
返回值:
M_HTTP_GET
M_HTTP_POST
M_HTTP_HEAD
M_HTTP_PUT
M_HTTP_DELETE
M_HTTP_TRACE
M_HTTP_CONNECT
M_HTTP_OPTIONS
mln_http_set_method
mln_http_set_method(h,m)
描述:将mln_http_t
类型的h
中请求方法设置为m
,m
的可用值参考mln_http_get_method
的返回值部分。
返回值:无
mln_http_get_version
mln_http_get_version(h)
描述:获取类型为mln_http_t
的h
中HTTP版本
返回值:
M_HTTP_VERSION_1_0
HTTP 1.0M_HTTP_VERSION_1_1
HTTP 1.1
mln_http_set_version
mln_http_set_version(h,v)
描述:将mln_http_t
类型的h
中的HTTP版本号为v
,v
的取值参考mln_http_get_version
的返回值。
返回值:无
mln_http_get_type
mln_http_get_type(h)
描述:获取类型为mln_http_t
的h
中HTTP类型,即请求还是响应。
返回值:
M_HTTP_UNKNOWN
未知类型M_HTTP_REQUEST
请求M_HTTP_RESPONSE
响应
mln_http_set_type
mln_http_set_type(h,t)
描述:将mln_http_t
类型的h
中报文类型设置为t
,t
的取值参考mln_http_get_type
的返回值。
返回值:无
mln_http_get_handler
mln_http_get_handler(h)
描述:获取类型为mln_http_t
的h
中体处理函数指针。
返回值:类型为mln_http_handler
的函数指针
mln_http_set_handler
mln_http_set_handler(h,hlr)
描述:将mln_http_t
类型的h
中提处理函数设置为mln_http_handler
类型的hlr
。
返回值:无
mln_http_get_response_msg
mln_http_get_response_msg(h)
描述:获取类型为mln_http_t
的h
中响应信息,即类似:Bad Request 或 Internal Server Error等字符串。
返回值:mln_string_t
类型指针
mln_http_set_response_msg
mln_http_set_response_msg(h,m)
描述:将mln_http_t
类型的h
中响应信息设置为mln_string_t
类型指针的m
。
返回值:无
mln_http_get_error
mln_http_get_error(h)
#define M_HTTP_CONTINUE 100
#define M_HTTP_SWITCHING_PROTOCOLS 101
#define M_HTTP_PROCESSING 102
#define M_HTTP_OK 200
#define M_HTTP_CREATED 201
#define M_HTTP_ACCEPTED 202
#define M_HTTP_NON_AUTHORITATIVE_INFORMATION 203
#define M_HTTP_NO_CONTENT 204
#define M_HTTP_RESET_CONTENT 205
#define M_HTTP_PARTIAL_CONTENT 206
#define M_HTTP_MULTI_STATUS 207
#define M_HTTP_MULTIPLE_CHOICES 300
#define M_HTTP_MOVED_PERMANENTLY 301
#define M_HTTP_MOVED_TEMPORARILY 302
#define M_HTTP_SEE_OTHER 303
#define M_HTTP_NOT_MODIFIED 304
#define M_HTTP_USE_PROXY 305
#define M_HTTP_SWITCH_PROXY 306
#define M_HTTP_TEMPORARY_REDIRECT 307
#define M_HTTP_BAD_REQUEST 400
#define M_HTTP_UNAUTHORIZED 401
#define M_HTTP_PAYMENT_REQUIRED 402
#define M_HTTP_FORBIDDEN 403
#define M_HTTP_NOT_FOUND 404
#define M_HTTP_METHOD_NOT_ALLOWED 405
#define M_HTTP_NOT_ACCEPTABLE 406
#define M_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
#define M_HTTP_REQUEST_TIMEOUT 408
#define M_HTTP_CONFLICT 409
#define M_HTTP_GONE 410
#define M_HTTP_LENGTH_REQUIRED 411
#define M_HTTP_PRECONDITION_FAILED 412
#define M_HTTP_REQUEST_ENTITY_TOO_LARGE 413
#define M_HTTP_REQUEST_URI_TOO_LARGE 414
#define M_HTTP_UNSUPPORTED_MEDIA_TYPE 415
#define M_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE 416
#define M_HTTP_EXPECTATION_FAILED 417
#define M_HTTP_TOO_MANY_CONNECTIONS 421
#define M_HTTP_UNPROCESSABLE_ENTITY 422
#define M_HTTP_LOCKED 423
#define M_HTTP_FAILED_DEPENDENCY 424
#define M_HTTP_UNORDERED_COLLECTION 425
#define M_HTTP_UPGRADE_REQUIRED 426
#define M_HTTP_RETRY_WITH 449
#define M_HTTP_INTERNAL_SERVER_ERROR 500
#define M_HTTP_NOT_IMPLEMENTED 501
#define M_HTTP_BAD_GATEWAY 502
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
即请求还是响应。
返回值:
M_HTTP_UNKNOWN
未知类型M_HTTP_REQUEST
请求M_HTTP_RESPONSE
响应
mln_http_set_type
mln_http_set_type(h,t)
描述:将mln_http_t
类型的h
中报文类型设置为t
,t
的取值参考mln_http_get_type
的返回值。
返回值:无
mln_http_get_handler
mln_http_get_handler(h)
描述:获取类型为mln_http_t
的h
中体处理函数指针。
返回值:类型为mln_http_handler
的函数指针
mln_http_set_handler
mln_http_set_handler(h,hlr)
描述:将mln_http_t
类型的h
中提处理函数设置为mln_http_handler
类型的hlr
。
返回值:无
mln_http_get_response_msg
mln_http_get_response_msg(h)
描述:获取类型为mln_http_t
的h
中响应信息,即类似:Bad Request 或 Internal Server Error等字符串。
返回值:mln_string_t
类型指针
mln_http_set_response_msg
mln_http_set_response_msg(h,m)
描述:将mln_http_t
类型的h
中响应信息设置为mln_string_t
类型指针的m
。
返回值:无
mln_http_get_error
mln_http_get_error(h)
#define M_HTTP_CONTINUE 100
#define M_HTTP_SWITCHING_PROTOCOLS 101
#define M_HTTP_PROCESSING 102
#define M_HTTP_OK 200
#define M_HTTP_CREATED 201
#define M_HTTP_ACCEPTED 202
#define M_HTTP_NON_AUTHORITATIVE_INFORMATION 203
#define M_HTTP_NO_CONTENT 204
#define M_HTTP_RESET_CONTENT 205
#define M_HTTP_PARTIAL_CONTENT 206
#define M_HTTP_MULTI_STATUS 207
#define M_HTTP_MULTIPLE_CHOICES 300
#define M_HTTP_MOVED_PERMANENTLY 301
#define M_HTTP_MOVED_TEMPORARILY 302
#define M_HTTP_SEE_OTHER 303
#define M_HTTP_NOT_MODIFIED 304
#define M_HTTP_USE_PROXY 305
#define M_HTTP_SWITCH_PROXY 306
#define M_HTTP_TEMPORARY_REDIRECT 307
#define M_HTTP_BAD_REQUEST 400
#define M_HTTP_UNAUTHORIZED 401
#define M_HTTP_PAYMENT_REQUIRED 402
#define M_HTTP_FORBIDDEN 403
#define M_HTTP_NOT_FOUND 404
#define M_HTTP_METHOD_NOT_ALLOWED 405
#define M_HTTP_NOT_ACCEPTABLE 406
#define M_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
#define M_HTTP_REQUEST_TIMEOUT 408
#define M_HTTP_CONFLICT 409
#define M_HTTP_GONE 410
#define M_HTTP_LENGTH_REQUIRED 411
#define M_HTTP_PRECONDITION_FAILED 412
#define M_HTTP_REQUEST_ENTITY_TOO_LARGE 413
#define M_HTTP_REQUEST_URI_TOO_LARGE 414
#define M_HTTP_UNSUPPORTED_MEDIA_TYPE 415
#define M_HTTP_REQUESTED_RANGE_NOT_SATISFIABLE 416
#define M_HTTP_EXPECTATION_FAILED 417
#define M_HTTP_TOO_MANY_CONNECTIONS 421
#define M_HTTP_UNPROCESSABLE_ENTITY 422
#define M_HTTP_LOCKED 423
#define M_HTTP_FAILED_DEPENDENCY 424
#define M_HTTP_UNORDERED_COLLECTION 425
#define M_HTTP_UPGRADE_REQUIRED 426
#define M_HTTP_RETRY_WITH 449
#define M_HTTP_INTERNAL_SERVER_ERROR 500
#define M_HTTP_NOT_IMPLEMENTED 501
#define M_HTTP_BAD_GATEWAY 502
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-20j6qCeq-1713174644121)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!