单消息队列客户-服务器间的双向通信

client.c

#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#define maxn 101
/**
消息队列发送信息全过程有:
1>定义消息结构
2>打开/创建消息队列
3>组装信息
4>发送信息
5>发送判断
消息队列接收信息全过程:
1>定义消息结构
2>打开/创建消息队列
3>准备接收消息缓冲区
4>接收消息
5>接收判断

**/
struct mymsgbuf
{
        long mtype;
        char  ctext[100];
};
void _encode(char e_message[],char d_message[])
{
        long i ;
        sscanf(d_message,"%s",e_message);
        memset(d_message,0,sizeof(d_message));
        for(i = 0;i < strlen(e_message);i++)
        {
                sprintf(d_message,"%s%03d",d_message,e_message[i]+588);
        }
}
int  main()
{
    /**发送信息例子**/
        struct  mymsgbuf buf;
        int msgid;
        char d_message[maxn];
        char e_message[maxn];
        printf("输入要发送的消息:");
        if((msgid = msgget(0x1234,0666|IPC_CREAT)) <0)
        {
                fprintf(stderr, "open msg %X failed.
",0x1234 );
                return ;
        }
        while(strncmp(d_message,"exit",4))
        {
                memset(&buf,0,sizeof(buf));
                memset(d_message,'',sizeof(d_message));
                memset(e_message,'',sizeof(e_message));

                /**从键盘输入消息结构数据内容**/
                fgets(d_message,sizeof(d_message),stdin);
                /**加密信息**/
                printf("加密前的信息是: %s
",d_message);
                _encode(d_message,e_message);
                printf("加密后的信息是: %s
",e_message);
                /**设置消息类型为进程ID**/
                strcpy(buf.ctext,e_message);
                buf.mtype = getpid();
                /**发送信息**/
                while((msgsnd(msgid,&buf,strlen(buf.ctext),0)) < 0)
                {
                        if(errno == EINTR) continue;
                        return;
                }
                printf("输入要发送的消息:");
        }
        return 0;
}
View Code

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define maxn 101
/**
消息队列发送信息全过程有:
1>定义消息结构
2>打开/创建消息队列
3>组装信息
4>发送信息
5>发送判断
消息队列接收信息全过程:
1>定义消息结构
2>打开/创建消息队列
3>准备接收消息缓冲区
4>接收消息
5>接收判断

**/
struct mymsgbuf
{
        long mtype;
        char  ctext[100];
};
void _decode(char e_message[],char d_message[])
{
        int i ,n = strlen(e_message);
        char buf1[4];
        memset(d_message,0,sizeof(d_message));
        for(i = 0 ;i < n;)
        {
                memset(buf1,0,sizeof(buf1));
                sscanf(e_message,"%03s%s",buf1,e_message); 
                i = i+3 ;
                sprintf(d_message,"%s%c",d_message,atoi(buf1)-588);
        }
        sprintf(e_message,"%s",d_message);
}
int  main()
{
        /**接收信息例子**/
        struct  mymsgbuf buf;
        int msgid;
        int ret;
        if((msgid = msgget(0x1234,0666|IPC_CREAT)) <0)
        {
                fprintf(stderr, "open msg %X failed.
",0x1234 );
                return ;
        }
        while(strncmp(buf.ctext,"exit",4))
        {
                memset(&buf,0,sizeof(buf));
                /**接收信息**/
                printf("waiting ............

");
                while((msgrcv(msgid,&buf,sizeof(buf.ctext),0,0)) < 0)
                {
                        if(errno == EINTR) continue;
                        return;
                }
                char e_message[maxn];
                char d_message[maxn];
                strcpy(e_message,buf.ctext);
                int len;
                printf("加密后的信息是: %s
",e_message);
                _decode(e_message,d_message);
                strcpy(buf.ctext,d_message);
                fprintf(stderr, "Msg : Type = %ld,Len = %d,Text :%s
",buf.mtype,ret,buf.ctext );
        }
        return 0;
}
View Code

结果如下:

client.png

server.png

原文地址:https://www.cnblogs.com/chenyang920/p/4984498.html