多线程网络服务
发表于: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服务器忘记密码