0

我正在解决一个问题,这意味着一个基本的正在运行的服务器客户端(之前做过一个)。问题是我运行服务器而不是运行客户端。我的 msg Que 是在两个客户端都将我的字符作为输入发送它时创建的,我得到确认打印但我的服务器 msgrcv 没有响应。

sc

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <errno.h>

#include "struc.h"


int main(){
    int qt;
    struct msg m;

    qt = msgget(1271,IPC_CREAT|IPC_EXCL|0600);
    if(qt < 0){ perror("Error MSGGET()\n");}
    printf("msg queue created!\n");

    if(msgrcv(qt,&m,sizeof(struct msg),0,0)<0){
        perror("Msg recive error");
    }   
    printf("msg recived!\n");


    msgctl(qt,IPC_RMID,NULL);
    return 0;
}

抄送

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <errno.h>

#include "struc.h"

int main(){
    int qt;
    struct msg m;
    qt = msgget(1271,0);
    if(qt < 0){ perror("~~~ Error MSGGET()\n");}
    printf("msg created!\n");

    printf("Enter one char: !\n");
    scanf("%c",&m.c);

    msgsnd(qt, &m,sizeof(struct msg),0);
    printf("msg sent!\n");
return 0;
}

结构体

struct msg{
    long mtype;
//  matrix M;
    char c;
};

(通过创建 3 个文件,您可以自己进行测试。欢迎任何想法,也许我错过了一些东西)

4

1 回答 1

1

您应该这样做以验证发送不会失败。

 if(msgsnd(qt, &m,sizeof(struct msg),0)) < 0) {
    perror("Msg send error");
  }

您还应该注意 msgsnd 的文档:

msgp 参数是指向调用者定义的结构的指针
以下一般形式:

       结构 msgbuf {
           长 mtype; /* 消息类型,必须 > 0 */
           字符多文本[1];/* 消息数据 */
        };

也就是说,您必须将您发送的消息中的 mtype 设置为 > 0。目前它未初始化,因此您应该这样做:

m.mtype = 1;
if(msgsnd(qt, &m,sizeof(struct msg),0)) < 0) {
   perror("Msg send error");
}
于 2012-06-06T21:33:35.120 回答