加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

基于消息机制的异步架构之消息队列

发布时间: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】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读