|
两个聊天端,分别称之为 server和 client .
server 端代码:
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <string.h>
#define BUF_SIZE 256
#define PROJ_ID 32
#define PATH_NAME "/tmp"
#define SERVER_MSG 1
#define CLIENT_MSG 2
int main()
{
struct mymsgbuf {
long msgtype;
char ctrlstring [BUF_SIZE];
} msgbuffer;
int qid;
int msglen;
int msgkey;
if ((msgkey = ftok (PATH_NAME, PROJ_ID)) == -1) {
perror ("ftok error!\n");
exit (1);
}
if ((qid = msgget (msgkey, IPC_CREAT|0660)) == -1) {
perror ("msgget error!\n");
exit (1);
}
while (1) {
printf ("server: ");
fgets (msgbuffer.ctrlstring, BUF_SIZE, stdin);
if (strncmp ("exit", msgbuffer.ctrlstring, 4) == 0) {
msgctl (qid, IPC_RMID, NULL);
break;
}
msgbuffer.ctrlstring [strlen (msgbuffer.ctrlstring) - 1] = '\0';
msgbuffer.msgtype = SERVER_MSG;
if (msgsnd (qid, &msgbuffer, strlen (msgbuffer.ctrlstring) + 1, 0) == -1){ /*+1为包括'\0'进去*/
perror ("Server msgsnd error!\n");
exit (1);
}
if (msgrcv (qid, &msgbuffer, BUF_SIZE, CLIENT_MSG, 0) == -1) {
perror ("Server msgrcv error!\n");
exit (1);
}
printf ("Client: %s\n", msgbuffer.ctrlstring);
}
exit (0);
}
client 端代码:
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <string.h>
#define BUF_SIZE 256
#define PROJ_ID 32
#define PATH_NAME "/tmp"
#define SERVER_MSG 1
#define CLIENT_MSG 2
int main()
{
struct mymsgbuf {
long msgtype;
char ctrlstring [BUF_SIZE];
} msgbuffer;
int qid;
int msglen;
key_t msgkey;
if ((msgkey = ftok (PATH_NAME, PROJ_ID)) == -1) {
perror ("ftok error!\n");
exit (1);
}
if ((qid = msgget (msgkey, IPC_CREAT|0660)) == -1) {
perror ("msgget error!\n");
exit (1);
}
while (1) {
if (msgrcv (qid, &msgbuffer, BUF_SIZE, SERVER_MSG, 0) == -1) {
perror ("Server msgrcv error!\n");
exit (1);
}
printf ("server: %s\n", msgbuffer.ctrlstring);
printf ("client: ");
fgets (msgbuffer.ctrlstring, BUF_SIZE, stdin);
if (strncmp ("exit", msgbuffer.ctrlstring, 4) == 0) {
break;
}
msgbuffer.ctrlstring [strlen (msgbuffer.ctrlstring) - 1] = '\0';
msgbuffer.msgtype = CLIENT_MSG;
if (msgsnd (qid, &msgbuffer, strlen (msgbuffer.ctrlstring) + 1, 0) == -1) {
perror ("client msgsnd error!\n");
exit (1);
}
}
exit (0);
} server 运行及输出:beyes@linux-beyes:~/C/queue> ./server.exe
server: hello sam
Client: hello tom
server: what are you doing now ?
Client: yes ,i am working, very busy!!
server: so do i, i will exit now
Client: ok bye
server: exit
client 运行及输出:beyes@linux-beyes:~/C/queue> ./client.exe
server: hello sam
client: hello tom
server: what are you doing now ?
client: yes ,i am working, very busy!!
server: so do i, i will exit now
client: ok bye
Server msgrcv error!
: Identifier removed |
|