Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
其他的不管,只是关注一下alarm的用法,设定了msgrcv超时。


环境是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);
                }
                                                                                                                                       
                                                                                                                                       
}
}

Feedback

# re: 我创建的消息队列为什么最大只能接收到8位信息--只关注alarm的用法  回复  更多评论   

2009-04-30 16:14 by 半岛刀客
在msgsnd的长度参数,最好不要用sizeof()...,请直接用定长试试

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理