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

  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/chenyang920/p/4984498.html
Copyright © 2011-2022 走看看