亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

多進程網絡服務

發布時間:2020-07-05 10:02:41 來源:網絡 閱讀:522 作者:匯天下豪杰 欄目:網絡安全

1、高性能網絡服務程序

  Linux的一個應用優勢是可用于設計各種高性能網絡服務程序,高性能的一個特點就是實現并發訪問處理,及同時為多個在線用戶提供服務;多進程網絡服務、多線程網絡服務、線程池網絡服務;

2、多進程網絡服務

  :利用Linux系統中的父子進程關系為多用戶提供并發服務,是一種比較流行的并發服務技術,其基本理念是:來一個用戶,啟動一個服務進程。若有新連接到來,則啟動子進程與其交互,服務結束后,其子進程自動退出。

模型如下:

多進程網絡服務

3、代碼實現:

用一個整數的運算模擬多進程的網絡服務。

(1)、utili.h

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>

#define SERVER_PORT  9090
#define SERVER_IP    "127.0.0.1"
#define LISTEN_QUEUE  5
#define BUFFER_SIZE   255


typedef enum{ADD,SUB,MUL,DIV,MOD, QUIT}OPER_TYPE;

typedef struct OperStruct{
    int op1;
    int op2;
    OPER_TYPE oper;
}OperStruct;

(2)、ser.c

#include"../utili.h"

void Process_Handler(int sockConn);

void Process_Handler(int sockConn){
    OperStruct op; 
    int result;
    while(1){
        int res = recv(sockConn, &op, sizeof(op), 0); 
        if(res == -1){
            printf("recv data fail.\n");
            continue;
        }   
        if(op.oper == ADD){
            result = op.op1 + op.op2;
        }else if(op.oper == SUB)
        {   
            result = op.op1 - op.op2;
        }else if(op.oper == MUL){
            result = op.op1 * op.op2;
        }else if(op.oper == DIV){
            result = op.op1 / op.op2;
        }else if(op.oper == QUIT){
            break;
        }   

        res = send(sockConn, &result, sizeof(result), 0); 
        if(res == -1){
            printf("send data fail.\n");
            continue;
        }
    }
    close(sockConn);
}

int main(void){
    int sockSer = socket(AF_INET, SOCK_STREAM, 0);
    if(sockSer == -1){
        perror("socket");
        return -1;
    }
    struct sockaddr_in addrSer, addrCli;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    socklen_t len = sizeof(struct sockaddr);
    int res = bind(sockSer, (struct sockaddr*)&addrSer, len);
    if(res == -1){
        perror("bind");
        close(sockSer);
        return -1;       
   }

    listen(sockSer, LISTEN_QUEUE);

    int sockConn;
    while(1){
        printf("Server Wait Client Connect.......\n");
        sockConn = accept(sockSer, (struct sockaddr*)&addrCli, &len);
        if(sockConn == -1){
            printf("Server Accept Client Connect Fail.\n");
            continue;
        }else{
            printf("Server Accept Client Connect Success.\n");
            printf("Client IP:>%s\n", inet_ntoa(addrCli.sin_addr));
            printf("Client Port:>%d\n",ntohs(addrCli.sin_port));
        }

        pid_t pid;
        pid = fork();
        if(pid == 0){
            close(sockSer);
            Process_Handler(sockConn);
            exit(0);
        }else if(pid > 0){
            close(sockConn);
            continue;    
        }else{
            printf("Create Process Fail.\n");
            continue;
        }
    }
    close(sockSer);
    return 0;
}

(3)、cli.c

#include"utili.h"

void InputData(OperStruct *pt);

void InputData(OperStruct *pt){
    printf("please input op1 and op2 : ");
    scanf("%d %d", &(pt->op1), &(pt->op2));
}

//Cli
int main(void){
    int sockCli = socket(AF_INET, SOCK_STREAM, 0); 
    if(sockCli == -1){
        perror("socket");
        return -1; 
    }   
    struct sockaddr_in addrSer;
    addrSer.sin_family = AF_INET;
    addrSer.sin_port = htons(SERVER_PORT);
    addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);

    socklen_t len = sizeof(struct sockaddr);
    int res = connect(sockCli, (struct sockaddr*)&addrSer, len);
    if(res == -1){
        perror("connect");
        close(sockCli);
        return -1; 
    }else{
        printf("Client Connect Server Success.\n");
    }

    char cmd[2];
    OperStruct  op;
    int result;
    while(1){
        printf("Please input operator : ");
        scanf("%s",cmd);
        if(strcmp(cmd, "+") == 0){
            op.oper = ADD;
            InputData(&op);
        }else if(strcmp(cmd,"-") == 0){
            op.oper = SUB;
            InputData(&op);
        }else if(strcmp(cmd,"*") == 0){
            op.oper = MUL;
            InputData(&op);
        }else if(strcmp(cmd,"/") == 0){
            op.oper = DIV;
            InputData(&op);
        }else if(strcmp(cmd, "quit") == 0){
            op.oper = QUIT;
        }else{    
            printf("Cmd invalid.\n");
        }

        res = send(sockCli, &op, sizeof(op), 0);
        if(res == -1){
            printf("send data fail.\n");
            continue;
        }
        if(op.oper == QUIT)
            break;
        res = recv(sockCli, &result, sizeof(result), 0);
        if(res == -1){
            printf("recv data fail.\n");
            continue;
        }
        printf("result = %d\n", result);
    }
    close(sockCli);
    return 0;
}

運行結果:

服務器

多進程網絡服務客戶1

客戶1

多進程網絡服務

客戶2

多進程網絡服務

4、結果分析

  (1)、utili.h在ser.c的上一層目錄,utili.h和cli.c是在同一層目錄;

  (2)、進程服務器:socker是引用計數器模型,close()是減少一個,并沒有真正的關閉,每次創建一個進程都會給socker引用計數器加1;

  (3)、缺點:a、啟動和關閉子進程帶來很大的開銷;b、系統最多只能產生512個進程,也就是說最多只有512個客戶,形成不了處理大型訪問的情形;



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克山县| 确山县| 大冶市| 昌黎县| 惠东县| 石门县| 涪陵区| 八宿县| 永城市| 蛟河市| 天津市| 和田市| 洪雅县| 浑源县| 中山市| 平山县| 九江市| 安阳市| 江陵县| 万州区| 西乡县| 二连浩特市| 扶余县| 米脂县| 孟村| 深水埗区| 集安市| 东辽县| 灵丘县| 睢宁县| 榆社县| 神木县| 定安县| 眉山市| 延吉市| 洮南市| 容城县| 黔西县| 濮阳市| 镇安县| 西平县|