千家信息网

多线程网络服务

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

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安全错误 数据库的锁怎样保障安全 广州大一互联网络科技有限公司 互联网的科技 互联网科技金融 南京欣网互联网科技 互联网科技ppt模板 兼蜜互联网科技 无锡溥仪互联网科技有限公司 互联网汽车科技小镇 互联网之后的科技是什么 中国科技互联网公司收入 互联网科技创新服务 成都铂石互联网科技做什么的 移动互联网年度科技创新 链环科技传统企业怎么转型互联网 互联网金融科技展 保险科技服务互联网营销体系 工业互联网展湾科技股份有限公司 东营紫格互联网科技 优雇互联网科技有限公司 株洲百竞科技的互联网营销顾问 中智农互联网科技 智慧科技互联网 开启互联网科技时代小说 互联网教育科技公司vipkid 互联网科技教育视频 晓花互联网科技有限公司网址 链环科技传统企业怎么转型互联网 广州新华互联网科技学校电竞方面 黑科技 体验场景 互联网大会 萌小萌互联网科技河南有限公司
0