千家信息网

多线程网络服务

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,1、多线程网络服务:多线程网络模式类似于多进程网络模式;不同的是:新客户端到来时,启动的是一个线程(每来一个客户,将创建一个线程)。模型分析2、代码实现同样用处理整数运算来模拟多线程的并发处理(1)、
千家信息网最后更新 2024年11月26日多线程网络服务

1、多线程网络服务

:多线程网络模式类似于多进程网络模式;不同的是:新客户端到来时,启动的是一个线程(每来一个客户,将创建一个线程)。

模型分析


2、代码实现

同样用处理整数运算来模拟多线程的并发处理

(1)、utili.h

#include#include#include#include#include#include#include#include#define SERVER_PORT  9090#define SERVER_IP    "127.0.0.1"#define LISTEN_QUEUE  5#define BUFFER_SIZE   255typedef 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* Thread_Handler(void *arg);void* Thread_Handler(void *arg){    int sockConn = *(int *)arg;    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);    pthread_exit(0);}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));        }        pthread_t tid;        pthread_create(&tid, NULL, Thread_Handler, &sockConn);            }    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));}//Cliint 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

客户2

3、分析总结

多线程网络服务也存在线程的动态申请与释放,还是有一定的开销,若存在大量用户在线,很可能带来线程间切换开销。



线程 网络 客户 服务 网络服务 开销 模式 分析 处理 不同 代码 动态 客户端 整数 服务器 模型 用户 结果 还是 进程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 税控服务器管理在哪里 ssh中查询数据库连接 山西二五六互联网科技公司 加拿大中通网络技术有限公司 嘉定区品牌网络技术服务哪家好 疫情防控网络安全的脚本 重庆国产服务器虚拟主机 湛江餐饮软件开发方案 ubuntu数据库搜索的命令 简述网络安全系统的脆弱性 网络安全技能竞赛题库及答案 数据库语言的类型转换 网络安全监督管理 软件开发行业最有效推广渠道 茶叶进销存数据库 2018中职生网络安全 网络安全周郑州2020 网络安全专委会的职责 长沙软件开发行业网站 八哥网络技术有限公司 服务器8080端口自己开放的吗 服务器管理器列表刷新不了 网络安全攻防实验室 的英文 东西湖网络安全最新动态 网络安全管理应急处理制度 网络安全的第二个是 时序数据库的速度 怎么面试上位机软件开发工程师 优化数据库性能 戴尔R420服务器忘记密码
0