news 2026/10/13 12:04:35

TCP并发实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TCP并发实现

文章目录

  • TCP服务端
    • 基础服务端
    • TCP服务设计模式
      • 迭代服务(一次处理一个客户端)
      • 多进程并发服务
        • 僵尸进程处理(信号处理)
      • 多线程并发服务
        • 嵌入式设备线程注意
  • TCP客户端
    • 基础客户端
      • 交互式客户端
    • 客户端断线重连机制

TCP服务端

基础服务端

// 基础TCP服务器核心流程#defineBUFFER_SIZE1024// 根据设备内存自定义charbuf[BUFFER_SIZE];intmain(){// 1. 创建socketfd=socket(AF_INET,SOCK_STREAM,0);// 2. 准备地址结构addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=0;// INADDR_ANY的另一种写法// 3. 绑定地址bind(fd,(structsockaddr*)&addr,sizeof(addr));// 4. 开始监听listen(fd,BACKLOG);// 5. 接受连接(阻塞等待)newfd=accept(fd,NULL,NULL);// 不关心客户端地址// 6. 接收数据read(newfd,buf,BUFFER_SIZE);// 7. 关闭连接close(newfd);close(fd);return0;}

TCP服务设计模式

迭代服务(一次处理一个客户端)

// 简化的迭代服务器框架while(1){client_fd=accept(server_fd,NULL,NULL);if(client_fd<0)continue;handle_client(client_fd);// 处理客户端请求close(client_fd);// 处理完后关闭}

缺点:无法并发处理多个客户端

多进程并发服务

// 父进程:监听连接,创建子进程处理// 子进程:处理具体客户端请求,结束后退出pid_tpid=fork();if(pid==0){// 子进程close(server_fd);// 关闭不需要的监听sockethandle_client(client_fd);close(client_fd);exit(0);// 子进程结束}else{// 父进程close(client_fd);// 父进程关闭已分发的客户端socketwaitpid(-1,NULL,WNOHANG);// 非阻塞回收子进程}
僵尸进程处理(信号处理)
// 使用信号处理函数回收子进程voidsigchld_handler(intsig){while(waitpid(-1,NULL,WNOHANG)>0){// 回收所有已终止的子进程}}// 注册信号处理器signal(SIGCHLD,sigchld_handler);// 更推荐使用sigaction(可重启系统调用)structsigactionsa;sa.sa_handler=sigchld_handler;sigemptyset(&sa.sa_mask);sa.sa_flags=SA_RESTART|SA_NOCLDSTOP;sigaction(SIGCHLD,&sa,NULL);

多线程并发服务

// 主线程:监听连接,创建子线程// 工作线程:处理客户端请求void*client_handler(void*arg){intclient_fd=*(int*)arg;// 处理客户端...close(client_fd);returnNULL;}// 创建线程处理每个客户端pthread_ttid;int*client_fd_ptr=malloc(sizeof(int));*client_fd_ptr=client_fd;pthread_create(&tid,NULL,client_handler,client_fd_ptr);pthread_detach(tid);// 分离线程,自动回收资源
嵌入式设备线程注意
// 1. 设置线程栈大小(嵌入式内存有限)pthread_attr_tattr;pthread_attr_init(&attr);pthread_attr_setstacksize(&attr,8192);// 8KB栈空间// 2. 线程池模式(避免频繁创建销毁线程)// 3. 注意线程安全,共享数据加锁

TCP客户端

基础客户端

// 核心流程intmain(){// 1. 创建socketfd=socket(AF_INET,SOCK_STREAM,0);// 2. 设置服务器地址addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr("127.0.0.1");// 3. 连接服务器connect(fd,(structsockaddr*)&addr,sizeof(addr));// 4. 发送数据write(fd,STR,sizeof(STR));// 5. 关闭连接close(fd);}

交互式客户端

// 支持命令行参数和交互式输入intmain(intargc,char*argv[]){// 检查参数if(argc<3){fprintf(stderr,"用法: %s <IP地址> <端口>\n",argv[0]);exit(EXIT_FAILURE);}// 解析参数char*server_ip=argv[1];intserver_port=atoi(argv[2]);// 创建socket和连接...// 交互循环while(1){printf("请输入消息: ");fgets(buf,BUFSIZ,stdin);// 发送数据intn=write(fd,buf,strlen(buf));if(n<=0){perror("发送失败");break;}// 可选:接收服务器响应// n = read(fd, response, sizeof(response));}}

客户端断线重连机制

// 嵌入式设备常用,增加连接稳定性#defineMAX_RETRY5#defineRETRY_DELAY3// 秒intconnect_with_retry(constchar*ip,intport,intmax_retry){intsockfd;structsockaddr_inaddr;for(intretry=0;retry<max_retry;retry++){sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("创建socket失败");return-1;}memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(port);inet_pton(AF_INET,ip,&addr.sin_addr);if(connect(sockfd,(structsockaddr*)&addr,sizeof(addr))==0){printf("连接成功(第%d次尝试)\n",retry+1);returnsockfd;}close(sockfd);printf("连接失败,%d秒后重试...\n",RETRY_DELAY);sleep(RETRY_DELAY);}fprintf(stderr,"连接失败,达到最大重试次数\n");return-1;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 5:01:53

【课程设计/毕业设计】基于springboot的宠物医院管理系统 宠物商城购物系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/12 5:02:00

【QT】3.QWidget控件

目录 1. enabled&#xff1a;是否可用状态 2. geometry&#xff1a;位置与大小 3. windowFrame&#xff1a;窗口框架 4. windowTitle&#xff1a;窗口标题 5. windowIcon&#xff1a;窗口图标 6. qrc 资源文件机制 7. windowOpacity&#xff1a;窗口透明度 8. cursor&a…

作者头像 李华
网站建设 2026/10/12 5:02:06

CC攻击的核心本质

一、CC攻击的核心本质 CC攻击的本质是“利用应用层协议漏洞&#xff0c;以合法请求外衣实施的资源耗尽攻击”。其核心逻辑是&#xff1a;攻击者通过控制大量傀儡机&#xff08;僵尸网络&#xff09;或使用脚本工具&#xff0c;向目标服务器发送大量需要复杂计算或资源调用的请…

作者头像 李华
网站建设 2026/10/12 5:02:13

计算机Java毕设实战-基于springboot的erp仓储管理系统基于springboot实现的erp企业资源管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/11 14:10:45

企业为何要从AI工具转向Full Stack?深度解析!

在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已经成为企业提升竞争力的关键因素。然而&#xff0c;随着AI应用的不断深入&#xff0c;许多企业发现&#xff0c;单纯依赖“好用的工具”已无法满足日益复杂的业务需求。那么&#xff0c;企业为何需要从AI工…

作者头像 李华