简单的消息队列实例

来源:互联网 发布:双板挑选 知乎 编辑:程序博客网 时间:2024/04/26 11:10

服务端程序

**1.smd.h**#ifndef UPGRADE_H#define UPGRADE_H#define MSG_MAX_SIZE        (24)enum {    HTTP_TYPE_UPLOAD = 0x0,    HTTP_TYPE_DOWNLOAD};typedef struct _DownloadInfo{    char download_url[128];    char save_path[32];    char save_name[32];}DownloadInfo;enum {    MSG_START_UPGRADE = 0x01,    MSG_STOP_UPGRADE};struct msgbuf{    long msg_type;    char msg_text[MSG_MAX_SIZE];};enum{    MSG_TYPE_START_WIFIDOG_SETUP = 0x01,    MSG_TYPE_START_UPGRADE = 0x02,    MSG_TYPE_START_PING_SVR_IP = 0x03};#endif**2.Makefile**EXEC = smdOBJS = main.o#CFLAGS += -L$(ROOTDIR)/user/openssl-0.9.8e -L.CFLAGS += -L$(ROOTDIR)/lib/libnvram -lnvram -I$(ROOTDIR)/lib/libnvramall: $(EXEC).c.o:    $(CC) -c $(CFLAGS) $<$(EXEC): $(OBJS)    $(CC) $(OBJS) $(CFLAGS) -o $@romfs:    $(ROMFSINST) /bin/smdclean:    -rm -f $(EXEC) *.elf *.o**3.main.c**#include <stdio.h>#include <stdlib.h>#include <string.h>#include <linux/reboot.h>#include <sys/stat.h>  #include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include "smd.h"#include "nvram.h"int main(int argc, char *argv[]){    int msg_id = 0;    key_t key;    struct msgbuf msg_buf;    int nBytes = 0;    key = ftok("/dev/null", 'u');    msg_id = msgget(key, IPC_CREAT|0666);    if (msg_id < 0) {    printf("msgget failed\n");    return -1;    }     while(1) {    memset(&msg_buf, 0x0, sizeof(msg_buf));    msgrcv(msg_id, &msg_buf, MSG_MAX_SIZE, 0, IPC_NOWAIT);    if (nBytes >= 0) {    switch (msg_buf.msg_type) {    case MSG_TYPE_START_WIFIDOG_SETUP:    nvram_commit(RT2860_NVRAM);    nvram_commit(RT2860_BAK);    system("vwanip.sh");    system("wifimonitor.sh");    break;    case MSG_TYPE_START_PING_SVR_IP:    {    char command[64] = {0x0};    snprintf(command, sizeof(command), "ping %s -c 5", msg_buf.msg_text);    system(command);    }    break;    case MSG_TYPE_START_UPGRADE:    break;    default:    break;    }    }    }    return 0;    }

客户端程序:

/****/int msg_id = 0;key_t key;struct msgbuf msg_buf;memset(&msg_buf, 0x0, sizeof(msg_buf));msg_buf.msg_type = MSG_TYPE_START_WIFIDOG_SETUP;if (msgsnd(msg_id, (void *)&msg_buf, 0, 0) < 0) {    return -1;}/****/if (!strcmp(svr_cmd, CMD_DO_PING)) {    /* start do the ping action  */    memset(&msg_buf, 0x0, sizeof(msg_buf));    msg_buf.msg_type = MSG_TYPE_START_PING_SVR_IP;    strncpy(msg_buf.msg_text, svr_ip, sizeof(msg_buf.msg_text));    if (msgsnd(msg_id, (void *)&msg_buf, sizeof(msg_buf.msg_text), 0) < 0)     {        ret = -1;    }} 
0 0
原创粉丝点击