千家信息网

多线程网络服务

发表于: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安全错误 数据库的锁怎样保障安全 互联网与科技发展 重庆互联网络科技 互联网科技集团 为想互联网科技 蓝色互联网科技 深圳前海聚择互联网科技有限公司 贵州叶脉互联网科技有限公司所属行业 宁夏众和广鑫互联网科技有限公司 知域互联网科技有限公司大骗子 崇明区互联网教育科技售后服务 互联网科技扶贫时间 国大互联网教育科技有限公司工作 阿里互联网科技企业 小米互联网科技园入驻 广州千川互联网科技有限公司 国产互联网科技公司 万物互联网智能科技 湖北辰鑫科技互联网 易租星互联网科技有限公司 广州全民伙伴互联网科技有限公司 广州百单互联网科技有限公司 互联网科技卖菜 互联网 科技 易互联网科技有限公司 北京互联网络科技有限公司 西安小鹰速贷互联网科技有限公司 美国互联网科技公司 兰石爱特工业互联网科技分公司 山东蛋芒互联网科技有限公司 长沙易易互联网科技有限公司
0