服务器
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#define SERVER_PATH "/tmp/server_msg"
#define LEN 100
struct message{
long mtype;
int request_id;
char text[LEN];
};
int main() {
int status;
int server_message_id;
pid_t pid;
struct message client_message,response_message;
status = ftok(SERVER_PATH,'a');
if(status == -1){
perror("status happen mistake:\n");
exit(0);
}
server_message_id = msgget(status, IPC_CREAT|0755);
if(server_message_id == -1){
perror("server_message_id happen mistake:\n");
exit(0);
}
while(1){
//等待接受客户端发送过来的消息
memset(&client_message,0, sizeof(client_message));
//所有server请求的mtype都是1 所以msgtyp也是填一
msgrcv(server_message_id,&client_message,(sizeof(client_message.text)-sizeof(client_message.mtype)),1,0);
printf("receive message %d\n",client_message.request_id);
pid = fork();
if(pid == 0){
printf("create\n");
strcpy(response_message.text,"i love you");
response_message.mtype = 2;
msgsnd(client_message.request_id, &response_message, (sizeof(response_message) - sizeof(response_message.mtype)), 0);
}
wait(NULL);
}
return 0;
}
客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#define SERVER_PATH "/tmp/server_msg"
#define LEN 100
//发服务器的mtype是 1 接受的是 2
struct message {
long mtype;
int request_id;
char text[LEN];
};
#define SERVER_PATH "/tmp/server_msg"
int main() {
int client_message_id;
int server_message_id;
struct message client_message;
int status;
//创建自己的私有消息队列
client_message_id = msgget(IPC_PRIVATE, IPC_CREAT | 0777);
memset(&client_message, 0, sizeof(client_message));
client_message.mtype = 1;
client_message.request_id = client_message_id;
strcpy(client_message.text, "HELLO");
status = ftok(SERVER_PATH, 'a');
if (status == -1) {
perror("status happen mistake:\n");
exit(0);
}
server_message_id = msgget(status, IPC_CREAT | 0755);
if (server_message_id == -1) {
perror("server_message_id happen mistake:\n");
exit(0);
}
//把自己私有消息编号发送给服务器
if (msgsnd(server_message_id, &client_message, (sizeof(client_message.text) - sizeof(client_message.mtype)), 0)
== -1) {
perror("send mistake\n");
exit(0);
}
//等待接受服务器端发送过来的消息
memset(&client_message,0, sizeof(client_message));
//所有server请求的mtype都是1 所以msgtyp也是填一
msgrcv(client_message_id,&client_message,(sizeof(client_message)-sizeof(client_message.mtype)),2,0);
printf("%s\n",client_message.text);
return 0;
}