zoukankan      html  css  js  c++  java
  • 单消息队列客户-服务器间的双向通信

    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

  • 相关阅读:
    Python的17种骚操作
    Python使用pip下载慢的原因
    Mysql数据库的安装
    Python中遇到的难解的提示:
    Linux使用SecureCRT远程终端工具的使用
    Linux下IP命令使用详解
    (未解决)jmeter报错之“请在微信客户端打开链接”
    Python学习笔记系列——九九乘法表&猜大小
    《Mysql必知必会》笔记
    (未解决)记录一次登录&jmeter,留下的一地鸡毛
  • 原文地址:https://www.cnblogs.com/chenyang920/p/4984498.html
Copyright © 2011-2022 走看看