Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IPC消息队列中msg的结构_C_Linux_Chat_Message Queue - Fatal编程技术网

IPC消息队列中msg的结构

IPC消息队列中msg的结构,c,linux,chat,message-queue,C,Linux,Chat,Message Queue,在消息队列中使用消息结构的自定义定义时遇到一些问题。我正在客户端和服务器之间构建聊天应用程序。客户端正在发送消息,而服务器正在接收消息并打印它 这是服务器端代码- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include

在消息队列中使用消息结构的自定义定义时遇到一些问题。我正在客户端和服务器之间构建聊天应用程序。客户端正在发送消息,而服务器正在接收消息并打印它

这是服务器端代码-

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

#define MAX 200
#define SERVER 1L

typedef struct {
    long    gid;
    char    buffer[MAX];
    char    header[20];
    long    pid;
} MESSAGE;

struct msqid_ds buf;
MESSAGE msg;
int mid_server, mid_client;
key_t key1, key2;
int client_id = 0;

int main(){
    //Creating a message queue
    key1 = ftok(".", 'z');
    msg.gid = 1;
    if((mid_server = msgget(key1, IPC_CREAT | 0666))<0){           
        printf("Error Creating Message Queue\n");
        exit(-1);
    }

    //Receiving message from client, throws and error if input is invalid
        if(msgrcv(mid_server, &msg, MAX, SERVER, 0)<0){
        perror("msgrcv");
        exit(-1);
        }  
    //Server displays received message
        printf("SERVER receives: %s\n", msg.buffer);
        printf("SERVER receives---: %s\n", msg.header);
        printf("SERVER receives: %ld\n", msg.pid);                            
}

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大值200
#定义服务器1L
类型定义结构{
长gid;
字符缓冲区[MAX];
字符头[20];
长pid;
}信息;
结构msqid_ds buf;
消息消息;
int mid_服务器、mid_客户端;
按键1、按键2;
int client_id=0;
int main(){
//创建消息队列
键1=ftok(“.”,“z”);
msg.gid=1;
如果((mid_server=msgget(key1,IPC_CREAT | 0666))根据,那么
msgsz
参数是消息缓冲区的大小减去
mtype
。因此使用
sizeof(msg)
是不正确的,它将导致
msgsnd()
读取超出变量
msg
末尾的数据。此外,这将导致服务器失败,因为服务器只希望接收
MAX
字节(同样,不包括
mtype

我会避免向
struct msgbuf
添加多个成员变量,而是只添加一个成员,该成员是一个
char
数组,其大小足以容纳您要发送的任何数据,或者是另一个
struct
。例如:

#define MAX 200
#define SERVER 1L

struct payload {
    char    buffer[MAX];
    char    header[20];
    long    pid;
};

struct msgbuf {
    long gid;
    struct payload payload;
};
然后您可以在客户端中这样使用它:

struct msgbuf msg;

msg.gid = SERVER;
fgets(msg.payload.buffer, sizeof msg.payload.buffer, stdin);
strncpy(msg.payload.header, sizeof msg.payload.header, "msg");
msg.payload.pid = 2;

if (msgsnd(mid_server, &msg, sizeof msg.payload, IPC_NOWAIT) == -1) ...
在服务器中也是如此:

struct msgbuf msg;

if (msgrcv(mid_server, &msg, sizeof msg.payload, SERVER, 0) == -1) ...
请注意对
msgsnd()
msgrcv()
的调用的相似性


请注意对齐限制,如果在
struct payload
中有任何成员的对齐限制大于
gid
的对齐限制,则可能会导致
payload
gid
之后不立即跟随。
msgsz
参数应考虑到这一点。但是,上述代码应为fine.

是的,这很有效,非常感谢。我已经为这个问题困扰了一天。
struct msgbuf msg;

if (msgrcv(mid_server, &msg, sizeof msg.payload, SERVER, 0) == -1) ...