基于消息机制的异步架构之消息队列
发布时间:2020-12-16 07:42:37 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 消息队列的头文件msgqueue.h/* * msgqueue.h * */#ifndef MSGQUEUE_H_#define MSGQUEUE_H_#include "conn.h"#define MAX_MSG_LENGTH (1024)typedef st
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 消息队列的头文件msgqueue.h /* * msgqueue.h * */ #ifndef MSGQUEUE_H_ #define MSGQUEUE_H_ #include "conn.h" #define MAX_MSG_LENGTH (1024) typedef struct MSG { char buf[MAX_MSG_LENGTH]; uint16 buf_len; CONN* c; struct MSG* next; } MSG; typedef struct MSG_QUEUE { MSG *head; MSG *tail; int size; } MSG_QUEUE; MSG_QUEUE* create_msg_queue(); extern int push_msg(MSG_QUEUE *q,CONN* c); int empty_msg_queue( MSG_QUEUE *q); int get_msg(MSG_QUEUE *q,MSG* temp_msg); #endif /* MSGQUEUE_H_ */ 消息队列的实现文件 * msgqueue.c /* * msgqueue.c * */ #include "msgqueue.h" MSG_QUEUE* create_msg_queue() { MSG_QUEUE* qmsg=malloc(sizeof(MSG_QUEUE)); /*申请头尾指针结点*/ if(qmsg==NULL){ fprintf(stderr,"create_msg_queue malloc error,errno: %d %mn",errno); return NULL; } MSG* msg=malloc(sizeof(MSG)); /*申请链队头结点*/ if(msg==NULL){ fprintf(stderr,"create_head_msg malloc error,errno); free(qmsg); return NULL; } msg->next=NULL; qmsg->head=qmsg->tail=msg; qmsg->size=0; return qmsg; } int push_msg(MSG_QUEUE *q,CONN* c) { if(q->size>10240){ fprintf(stderr,"push_msg error,msg_queue size is over %d,q->size,errno); return -1; } MSG *msg; msg=malloc(sizeof(MSG)); /*申请新结点*/ if(msg==NULL){ fprintf(stderr,"create_new_msg malloc error,errno); return -1; } memcpy(msg->buf,c->in_buf,c->in_buf_len); msg->buf_len=c->in_buf_len; msg->c=c; msg->next=NULL; q->tail->next=msg; q->tail=msg; q->size++; return 0; } int empty_msg_queue( MSG_QUEUE *q) { if (q->head==q->tail) return 0; else return 1; } int get_msg(MSG_QUEUE *q,MSG* temp_msg) { if (q->head==q->tail){ return -1; } MSG *temp=q->head->next; if(q->head->next == q->tail) //如果要出队的结点为最后一个结点,使q->rear指向头结点防止出现悬空的指针 q->tail = q->head; // msg_buf = temp->buf; //将出队的数据元素存入*e temp_msg->c=temp->c; memcpy(temp_msg->buf,temp->buf,temp->buf_len); temp_msg->buf_len=temp->buf_len; q->head->next = temp->next; //使下一个结点成为队头,如果没有下一个结点则为NULL q->size--; //int buf_len=temp->buf_len; free(temp); //删除要出队的结点 return 0; } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |