QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 957|回复: 1

消息队列问题

[复制链接]
发表于 2006-5-22 09:40:19 | 显示全部楼层 |阅读模式
我创建的消息队列为什么最大只能接收到8位信息

环境是redhat9
当把发送缓冲中写入大于8位数据时 可以成功发送但只能收到8位信息

代码如下
//定义
struct msgbuf  //消息结构
{
        long mtype;
        char mtext[100];
}msgbuf;
                                                                                


//创建消息队列
void  creatque()
{
                                                                                                                                               
        static int msg_que_id=-1;
        struct sigaction action;
        /*检查是否存在的要创建的消息队列,如果存在到 就删除它*/
        msg_que_id=msgget(BOOKING_KEY,0);
        if(msg_que_id!=-1){
                if(msgctl(msg_que_id,IPC_RMID,0)==-1){
                        perror("remove old message");
                        exit(1);
                }
        }
        /*创建消息队列*/
        msg_que_id=msgget(BOOKING_KEY,IPC_CREAT|0666);
        if(msg_que_id==-1){
                perror("creat new message list");
                exit(1);
        }
        /*忽略其它一些参数*/
        action.sa_handler=SIG_IGN;
        action.sa_flags=0;
        sigemptyset(&action.sa_mask);
        sigaction(SIGINT,&action,NULL);
        sigaction(SIGQUIT,&action,NULL);
        sigaction(SIGHUP,&action,NULL);
}

//发消息
void control(char *c)
{
        int send_len;
        int msg_que_id=-1;
        struct msgbuf send_msg;
        memset(send_msg.mtext,'\0',sizeof(send_msg.mtext));
        send_len=sizeof(long)+sizeof(int);
        msg_que_id=msgget(BOOKING_KEY,0);
        if(msg_que_id==-1){
                perror("get message list id");
                exit(1);
        }
                                                                                
                                                                                
        if(!strncasecmp(c,"lk",2)){/*连接状态信号*/
                send_msg.mtype=httpd_stoped;
                sprintf(send_msg.mtext,"linking");
                if(msgsnd(msg_que_id,&send_msg,send_len,0)<0){
                        perror("send message");
                        exit(1);
                }
        }
}

//接收消息
void *other_key(void *data)
{
        int msg_que_id=-1;
        int rece_len,send_len;
        struct msgbuf rece_msg;
        memset(rece_msg.mtext,'\0',sizeof(rece_msg.mtext));
        send_len=sizeof(long)+sizeof(int);
        msg_que_id=msgget(BOOKING_KEY,0);
        if(msg_que_id==-1){
                perror("get message list id");
                exit(1);
        }
        while(1){
                /*定时器定时LKTIMEOUTs来接收30s一次的连接状态信号,*/
                /*如果时间到而没有接收到信号则判断接收方关闭了监视端,服务器将中断此次连接*/
                                                                                                                                       
                alarm(35);
                rece_len=msgrcv(msg_que_id,&rece_msg,sizeof(msgbuf)-sizeof(long),(int)httpd_stoped,0);
                if(rece_len<0){
                        perror("receive message");
                        exit(1);
                }
                if(!strcmp(rece_msg.mtext,"linking")){
                      alarm(0);
                }
                else if(!strcmp(rece_msg.mtext,"q")){
                         if(msgsnd(msg_que_id,&rece_msg,send_len,0)<0){/*把取出的结束信息再写回去(因为一条信息只能被取一次)*/
                                 perror("send message");               /*而取出一次只能结束一个进程*/
                                 exit(1);
                         }
                         exit(1);
                }
                                                                                                                                       
                                                                                                                                       
}
}
发表于 2006-5-22 12:13:17 | 显示全部楼层
http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=143469
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 16:35 , Processed in 0.040767 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表