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) ...