利用訊息佇列實現伺服器客戶端的通訊
阿新 • • 發佈:2019-01-22
1.server.c
#include"utili.h"
#define SND_TYPE 200
#define RCV_TYPE 100
typedef struct MsgType
{
long msg_type;
char msg_buf[MAX_MSG_LEN];
}MsgType;
int main(int argc, char const* argv[])
{
key_t msg_key = ftok("mymsg", 0xff);
if(msg_key == -1)
{
perror("ftok");
exit (EXIT_FAILURE);
}
int msg_id = msgget(msg_key, IPC_CREAT | 0755);
if(msg_id == -1)
{
perror("msgget");
exit(EXIT_FAILURE);
}
MsgType msg;
while(1)
{
msg.msg_type = SND_TYPE;
printf("Ser:>");
scanf("%s", msg.msg_buf);
msgsnd(msg_id, &msg, strlen (msg.msg_buf)+1, 0);
msgrcv(msg_id, &msg, MAX_MSG_LEN, RCV_TYPE, 0);
printf("Cli:>%s\n", msg.msg_buf);
}
return 0;
}
2.client.c
#include"utili.h"
#define SND_TYPE 100
#define RCV_TYPE 200
typedef struct MsgType
{
long msg_type;
char msg_buf[MAX_MSG_LEN];
}MsgType;
int main(int argc, char const* argv[])
{
key_t msg_key = ftok("mymsg", 0xff);
if(msg_key == -1)
{
perror("ftok");
exit(EXIT_FAILURE);
}
int msg_id = msgget(msg_key, 0);
if(msg_id == -1)
{
perror("msgget");
exit(EXIT_FAILURE);
}
MsgType msg;
while(1)
{
msgrcv(msg_id, &msg, MAX_MSG_LEN, RCV_TYPE, 0);
printf("Ser:>%s\n", msg.msg_buf);
msg.msg_type = SND_TYPE;
printf("Cli:>");
scanf("%s", msg.msg_buf);
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);
// msgrcv(msg_id, &msg, MAX_MSG_LEN, RCV_TYPE, 0);
// printf("Ser:>%s\n", msg.msg_buf);
}
return 0;
}
3.utili.h
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<string.h>
#include<stdlib.h>
#define MAX_MSG_LEN 256
4.Makefile
ALL:server client
server:server.c
gcc server.c -o server
client:client.c
gcc client.c -o client
clean:
/bin/rm -f server client
測試