亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 用消息隊列實現client和server間的通信.txt

?? 用消息隊列實現Client和Server間的通信
?? TXT
字號:
用消息隊列實現Client和Server間的通信


本文主要介紹UNIX操作系統中消息隊列機制、調用方法以及多路復用消息技術,通過應用實例,給出了其在Client和Server間的通信實現。

網絡應用的標準模型是客戶一服務員模型。在金融系統應用軟件開發中,這種模型被廣泛的采用,并且實現這種模型的方法多種多樣。因此,根據不同的業務類型,選擇較好的實現方法至關重要。

在UNIX系統的內部結構中,含有消息機構,即所有的消息都放在內核中,并且它們都有一個相應的消息隊列號。消息機構允許進程發送一個消息到任意其它進程,從而實現系統中進程間的通信。

一、UNIX系統中的消息機構
消息是一個格式化的可變長度的信息單元。它有如下屬性:(1)長整數類型 (2)消息的數據長度 (3)數據。由于消息的長度是可變的,故將消息分為消息首部和消息數據兩部分。在消息首部中,記錄著消息的類型和大小,指向消息數據區的指針,消息隊列的鏈接指針等。每個消息隊列有一個稱為 key的名稱,如同用戶文件描述符一樣,每個消息隊列還有一個消息隊列描述符。此外,在一個系統中,可能有若干個消息隊列,所有消息隊列的頭標組成一個數組。圖1 示出了消息和消息隊列的數據結構。

圖1 消息和消息隊列的數據結構

1. 建立或返回消息隊列描述符
進程可用系統調用megget來建立或返回消息隊列的描述符。該系統調用的語法格式為:
int megget(key,msgflg)
key_t key;
int megflg;
其中,key是消息隊列的名字;msgflg是用戶設置的標志。如果IPC_CREAT表示系統無以key命名的消息隊列,則建立消息隊列標識符;若已存在,則返回消息隊列描述符msgid。

  對于系統調用,核心將搜索消息隊列頭標數組,確定是否有指定關鍵字的消息隊列。若無,核心將分配一新的隊列結構,并返回給用戶一個消息隊列描述符;否則,它只是檢查消息隊列的許可權之后便返回。
2.消息的發送
進程可用megsnd( )系統調用來發送一個消息,并將它鏈入消息隊列的尾部。該系統調用的語法格式如下:
int msgsnd(msgid,msgp,msgsz,msgflg)
int msgid;
struct msgbuf * msgp;
int msgsz,msgflg;
其中,msgid是由msgget返回的消息隊列描述符;msgp指向包含這條消息的結構,該結構由如下兩個成員組成:
struct msgbuf
{
long mtype; /* 消息類型 */
char mtext[ ]; /* 消息的文本 */
}
msgsz是mtext的字節長度;msgflg規定了當無內存空間來存儲消息時,進程等待還是立即返回。
對于msgsnd( )系統調用,核心檢查消息隊列描述符和許可權是否合法;消息長度是否超過系統規定的長度,若過長,進程睡眠等待出現足夠大的空間,通過檢查后,核心為消息分配消息數據區,并將消息從用戶空間拷貝到消息數據區,分配消息首部,將它鏈入該消息隊列的尾部,在消息首部填寫消息類型,大小以及指向消息數據區的指針,還有修改消息隊列的頭標中的數據。然后喚醒在等待消息到來的隊列中睡眠的進程。
3. 消息的接收
進程可用msgrcv( )系統調用,從消息隊列中讀一條消息,語法格式為:
int msgrcv(msgid,msgp,msgsz,msgtyp,msgflg)
int msgid,msgsz,msgflg;
struct msgbuf * msgp;
long msgtyp;
其中,msgid,msgp,msgsz,msgflg與msgsnd相似,msgtype是規定用戶想讀的消息類型。
對于msgrcv( )系統調用是先由核心檢查消息隊列標識符和許可權,接著根據msgtyp分三種情況處理。
(1) msgtyp=0,核心尋找消息隊列中的第一個消息,并將它返回給調用進程;
(2)msgtyp為正整數,核心返回給類型的第一個消息;
(3)msgtyp為負整數,核心應在其類型值小于或等于msgtyp絕對值的所有消息中,選擇類型最低的第一消息返回。
如果所返回的消息的大小等于或小于用戶請求,核心便將消息正文拷貝到用戶區,再從隊列中刪除該消息,并喚醒睡眠的發送進程;如果消息比用戶要求的大,則系統返回錯誤信息。
4. 消息隊列的操縱
可利用msgctl( )系統調用,來改變消息隊列的屬性,即擁有者,許可權等。其語法格式如下:
int msgctl(msgid,cmd,buf)
int msgid,cmd;
struct msgid_ds * buf;
其中,cmd是規定的命令;buf是用戶緩沖區地址,用戶用它來存放控制參數和查詢結果。命令可分為三類:(1)用于查詢有關消息隊列的情況。(2)用于改變有關消息隊列的屬性。(3)消除消息隊列的標識符。
二、多路復用消息
在客戶-服務員模型中,一個服務員往往對應多個客戶。這時我們可以利用消息的類型參量,讓多個進程把消息放入同一個隊列中,以便消息隊列能夠多路復用。如圖2 所示,我們只要把type置為1,以表示消息是從客戶流向服務員的。如果客戶把它的進程號作為消息的一部分傳遞,那么服務員只要把客戶進程號作為其消息類型,把它的消息發送給客戶進程。每個客戶進程都把msgrcv的參數msgtyp置為其進程號。


圖2 消息隊列的多路復用

三、應用實例
由上面介紹,我們了解了UNIX 操作系統中消息隊列機構及調用方法,為了進一步說明其在Client 和Server 間的通信,我們給出如下應用實例:
1.實例說明
本例主要是Client 端向Server 端提出查詢申請,Server 端通過訪問系統上INFORMIX 數據庫,將所得信息反饋給Client 端。其中,把消息類型設為1表明消息是從Client 端傳到Server 端,消息類型設為2表明消息是從Server 端傳到Client 端。
INFORMIX 中的數據庫dxddb 里的表 dxdtable 數據結構如下:
(1) name char( /* 姓名 */
(2) acct_no char(16) /* 帳號 */
(3) ph_code char( /* 電話號碼 */

2.程序說明

(1)頭文件(文件名:msgg.h)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MKEY1 1234L
#define MKEY2 2345L
#define RERMS 0666

(2)公用函數
mesg_recv(id,mesgptr)
int id;
Mesg *mesgptr;
{
    int n;
    n=msgrcv(id,(char *) & (mesgptr->mesg_type),MAXMESGDATA,
    mesgptr->mesg_type,0);
    if((mesgptr->mesg_len=n)<0)
    printf("msgrcv error.\n");
    return(n);
}

mesg_send(id,mesgptr)
int id;
Mesg * mesgptr;
{
    if(msgsnd(id,(char*)&(mesgptr->mesg_type),
    mesgptr->mesg_len,0)!=0)
    printf("msgsnd error\n");
}

(3)Client端程序(文件名:client.c)
#include "msgg.h"
#include <stdio.h>
#define MAXMESGDATA 1024
typedef struct
{
    int mesg_len;
    long mesg_type;
    char mesg_data[1024];
} Mesg;

Mesg mesg;
int i;
main()
{
    int id;
    int sum;
    sum=0;
    for(; {
    if((id=msgget(MKEY1,0))<0)
    printf("client: can not msgget message queue 1.\n");
    else
    printf("CLIENT(%d)-> please send a message: ",sum++);
    client(id);
    }
    if(msgctl(id,IPC_RMID,(struct msqid_ds*)0)<0)
    printf("client: can't PMIN message queue 1.\n");
    exit(0);
}

client(id)
int id;
{
    int n;
    if (fgets(mesg.mesg_data,MAXMESGDATA,stdin)==NULL)
    printf("filename read error.\n");
    n=strlen(mesg.mesg_data);
    if(mesg.mesg_data[n-1]=='\n')
    n--;
    mesg.mesg_data[n]='\0';
    mesg.mesg_len=n;
    mesg.mesg_type=1L;
    mesg_send(id,&mesg);
    printf("client: this message has been sent to server. \nthe message from server is: \n\n");
    mesg.mesg_type=2L;
    while((n=mesg_recv(id,&mesg))>0)
    if(write(1,mesg.mesg_data,n)!=n)
    printf("data write error.\n");
    if (n>0)
    printf("data read error.\n");
}

(4)Server端程序(文件名:server.ec)
#include "msgg.h"
#include <stdio.h>
#define MESGHDRSIZE 1024
$typedef struct
{
    char name[9];
    char acct_no[17];
    char ph_code[8];
} st;
$typedef struct
{
    int mesg_len;
    long mesg_type;
    char mesg_data[8];
    st p_code;
} Mesg;
$typedef struct
{
    int mesg_len;
    long mesg_type;
    char mesg_error[20];
} Mesg1;
$include sqltypes.h;
$include sqlca;
$Mesg mesg;
$Mesg1 mesg1;
$char mm[9];
main()
{
    int id;
    int sum;
    sum=0;
    for(;
    {
        if((id=msgget(MKEY1,RERMS|IPC_CREAT))<0)
        printf("server: can not get message queue 1.\n");
        else
        {
            printf("server: waitting for server.... ");
            printf("%d \n",sum++);
            server(id);
        }
    }
}

server(id)
int id;
{
    int n,filefd;
    $database dxddb;
    mesg.mesg_type=1L;
    if((n=mesg_recv(id,&mesg))<=0)
    printf("serve:filename read error\n");
    mesg.mesg_data[n]='\0';
    strcpy(mm,mesg.mesg_data);
    printf("this message is :%s \n",mm);
    mesg.mesg_type=2L;
    $select * into $mesg.p_code
    from dxdtable
    where ph_code = $mm;
    if(sqlca.sqlcode==0)
    {
        printf("this name is :%s\n",mesg.p_code.name);
        printf("begin to send this message to client.\n");
        mesg.mesg_len=sizeof(mesg);
        mesg_send(id,&mesg);
        mesg.mesg_len=0;
        mesg_send(id,&mesg);
    }
    else
    {
        printf("this phone number is not exist ! \n");
        strcpy(mesg1.mesg_error,"there are not this number !");
        mesg1.mesg_type=2L;
        mesg1.mesg_len=strlen(mesg1.mesg_error);
        mesg_send(id,&mesg1);
        mesg1.mesg_len=0;
        mesg_send(id,&mesg1);
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产裸体歌舞团一区二区| 欧美日韩中字一区| 色婷婷av一区二区三区大白胸| 欧美图片一区二区三区| 日韩欧美不卡一区| 亚洲综合在线电影| 国产成人在线电影| 欧美年轻男男videosbes| 国产精品视频免费| 国产又黄又大久久| 欧美乱熟臀69xxxxxx| 亚洲欧美日韩一区二区| 国产精品一品视频| 日韩视频一区二区在线观看| 一区二区三区四区在线| 国产成人aaa| xnxx国产精品| 欧美a级理论片| 欧美精品自拍偷拍| 一区二区日韩av| 色综合色狠狠综合色| 亚洲欧洲成人精品av97| 国产成人综合亚洲91猫咪| 欧美一区二区国产| 日韩主播视频在线| 欧美精品一级二级| 亚洲3atv精品一区二区三区| 在线视频亚洲一区| 亚洲一区二区三区四区中文字幕| 99久久精品国产观看| 中文字幕色av一区二区三区| 国产不卡高清在线观看视频| 国产亚洲精品7777| 成人伦理片在线| 欧美经典一区二区| 成人激情免费网站| 亚洲视频1区2区| 91国模大尺度私拍在线视频| 亚洲欧美偷拍卡通变态| 色婷婷av一区二区| 亚洲精品国产无天堂网2021 | 日韩久久一区二区| 不卡av免费在线观看| 日韩一区日韩二区| 欧美最新大片在线看 | 色欲综合视频天天天| 一区二区三区中文字幕电影| 在线观看不卡视频| 天堂影院一区二区| 精品99999| 成人一区二区三区视频在线观看| 亚洲欧美在线视频| 精品视频999| 极品美女销魂一区二区三区| 日本一区二区三区电影| 91免费版pro下载短视频| 亚洲高清视频的网址| 欧美一级在线观看| 国产久卡久卡久卡久卡视频精品| 国产精品人妖ts系列视频| 91浏览器在线视频| 日韩电影在线免费观看| 久久美女高清视频| 91麻豆国产福利精品| 日韩电影在线观看网站| 久久久www成人免费无遮挡大片| youjizz久久| 午夜精品aaa| 中文字幕不卡一区| 91精品久久久久久久久99蜜臂| 国产主播一区二区三区| 亚洲欧美日韩国产手机在线| 日韩欧美国产电影| 91原创在线视频| 麻豆久久一区二区| 亚洲美女视频在线| 精品国产麻豆免费人成网站| 91麻豆123| 国产精品伊人色| 香蕉久久夜色精品国产使用方法| 久久久久国产精品厨房| 欧美日韩高清一区二区不卡| 国产成人一级电影| 免费观看在线综合色| 亚洲日本丝袜连裤袜办公室| 日韩精品中文字幕一区| 在线视频欧美区| 岛国精品在线播放| 久久成人久久鬼色| 亚洲电影欧美电影有声小说| 国产精品私人自拍| 精品久久久久久亚洲综合网| 欧美日本在线视频| 一本大道av伊人久久综合| 国产乱码精品一品二品| 免费在线一区观看| 一区二区三区免费在线观看| 中文字幕不卡的av| 久久婷婷一区二区三区| 日韩欧美国产一区二区在线播放| 91精品1区2区| 一本色道久久加勒比精品| 国产精品资源在线看| 精品一区二区在线观看| 日本在线不卡一区| 丝袜美腿高跟呻吟高潮一区| 一区二区三区不卡在线观看 | 欧美成人艳星乳罩| 91精品国产综合久久精品麻豆| 色偷偷一区二区三区| aaa欧美日韩| www.日韩大片| 99久久婷婷国产综合精品电影| 国产91对白在线观看九色| 国产一区二区三区免费在线观看| 麻豆91免费看| 久久www免费人成看片高清| 美国十次了思思久久精品导航| 天天亚洲美女在线视频| 午夜精品福利一区二区三区蜜桃| 亚洲综合激情小说| 蜜桃传媒麻豆第一区在线观看| 亚洲电影欧美电影有声小说| 亚洲午夜久久久久久久久电影院| 亚洲电影视频在线| 日韩电影在线观看电影| 美女视频黄久久| 国产经典欧美精品| 成人动漫一区二区| 在线这里只有精品| 91精品欧美福利在线观看| 日韩视频免费观看高清完整版在线观看| 56国语精品自产拍在线观看| 欧美r级在线观看| 精品国精品国产尤物美女| 国产女主播视频一区二区| 亚洲青青青在线视频| 亚洲一区自拍偷拍| 亚洲高清免费一级二级三级| 日本不卡视频在线| 国产一区二区三区在线观看精品| 成人国产电影网| 欧美日韩在线播放| 久久嫩草精品久久久精品一| 亚洲人午夜精品天堂一二香蕉| 亚洲一二三区在线观看| 蜜芽一区二区三区| 成人av免费网站| 欧美丰满美乳xxx高潮www| 国产视频一区不卡| 亚洲国产中文字幕| 国产成人在线观看免费网站| 91久久精品一区二区二区| 精品少妇一区二区三区免费观看 | 欧美电影一区二区| 国产日韩av一区| 亚洲福利一二三区| 高清不卡在线观看| 制服丝袜日韩国产| 亚洲欧美中日韩| 久久国产精品免费| 色噜噜狠狠一区二区三区果冻| 欧美成人精品1314www| 亚洲欧洲av另类| 韩国中文字幕2020精品| 色成人在线视频| 久久久777精品电影网影网| 亚洲小说欧美激情另类| 国产成人在线免费| 91精品国产一区二区三区| 亚洲欧洲国产专区| 国产一区二区在线看| 欧美二区三区91| 亚洲免费观看在线观看| 国产成人精品一区二区三区网站观看| 欧美视频三区在线播放| 国产精品人妖ts系列视频| 久久精品国产亚洲aⅴ| 欧美日韩精品三区| 一区二区三区视频在线看| eeuss影院一区二区三区| 2020国产精品久久精品美国| 日本伊人午夜精品| 欧美三级午夜理伦三级中视频| 国产精品传媒入口麻豆| 国产精品一线二线三线精华| 日韩一区二区高清| 日本91福利区| 7799精品视频| 日韩福利视频导航| 欧美老女人第四色| 亚洲不卡在线观看| 欧美色区777第一页| 亚洲电影一级片| 欧美视频一区在线| 午夜影视日本亚洲欧洲精品| 欧美无人高清视频在线观看| 一区二区在线看| 欧美中文字幕一区二区三区| 一区二区三区色|