news 2026/4/3 6:43:29

Linux多线程网络服务器开发详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux多线程网络服务器开发详解

一、前言

在网络编程中,为了提高服务器的并发处理能力,我们通常需要使用多线程技术。本文将详细介绍如何将传统的单线程服务器改造为多线程版本,并通过完整的代码示例展示实现过程。

二、多线程服务器设计思路

2.1 基本架构

多线程服务器的核心思想是:

  • 主线程:负责监听客户端连接请求
  • 子线程:每个连接创建一个独立的子线程处理通信

这种设计可以让服务器同时处理多个客户端请求,大大提高并发性能。

三、核心实现步骤

3.1 定义客户端信息结构体

首先,我们需要定义一个结构体来封装客户端的连接信息:

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<pthread.h>#include<arpa/inet.h>#include<sys/socket.h>#include<errno.h>#defineMAX_CLIENTS1024#defineBUFFER_SIZE1024#definePORT8888// 客户端信息结构体structSockInfo{intfd;// 客户端文件描述符structsockaddr_inaddr;// 客户端地址信息};

关键点说明

  • fd初始化为 -1 表示该位置可用
  • 封装结构体是为了通过线程参数传递多个数据

3.2 创建全局结构体数组

// 全局客户端信息数组structSockInfoclients[MAX_CLIENTS];// 初始化客户端数组voidinit_clients(){for(inti=0;i<MAX_CLIENTS;i++){clients[i].fd=-1;// -1 表示该位置可用memset(&clients[i].addr,0,sizeof(structsockaddr_in));}}

为什么初始化为 -1?

  • 文件描述符从 0 开始(0=stdin, 1=stdout, 2=stderr)
  • -1 明确表示无效描述符,便于判断空闲位置

3.3 子线程处理函数

// 子线程处理函数void*working(void*arg){structSockInfo*info=(structSockInfo*)arg;charbuf[BUFFER_SIZE];// 打印客户端连接信息charclient_ip[INET_ADDRSTRLEN];inet_ntop(AF_INET,&info->addr.sin_addr,client_ip,INET_ADDRSTRLEN);printf("[线程 %lu] 客户端连接: IP=%s, 端口=%d, fd=%d\n",pthread_self(),client_ip,ntohs(info->addr.sin_port),info->fd);// 通信循环while(1){memset(buf,0,sizeof(buf));// 接收数据intlen=read(info->fd,buf,sizeof(buf)-1);if(len==0){// 客户端断开连接printf("[线程 %lu] 客户端 %s:%d 断开连接\n",pthread_self(),client_ip,ntohs(info->addr.sin_port));break;}elseif(len<0){perror("read error");break;}// 打印接收到的数据printf("[线程 %lu] 收到数据: %s",pthread_self(),buf);// 回显数据给客户端write(info->fd,buf,len);}// 关闭连接并重置状态close(info->fd);info->fd=-1;// 标记为可用returnNULL;}

关键技术点

  1. 参数转换(struct SockInfo*)arg将 void* 转换为结构体指针
  2. 阻塞读取read()会阻塞直到有数据到达
  3. 资源释放:通信结束后关闭 fd 并重置为 -1

3.4 主函数实现

intmain(){// 初始化客户端数组init_clients();// 1. 创建监听套接字intlfd=socket(AF_INET,SOCK_STREAM,0);if(lfd==-1){perror("socket error"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 5:41:50

超详细版ESP32固件库下载步骤(智能家居专用)

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。我以一位深耕嵌入式系统多年、长期从事智能家居产品量产落地的工程师视角&#xff0c;彻底重写了全文—— 去除所有AI腔调、模板化表达和教科书式分节 &#xff0c;代之以真实开发现场的语言节奏、踩坑经验…

作者头像 李华
网站建设 2026/3/15 12:38:15

利用USBlyzer诊断通信故障:实战案例定位问题根源

以下是对您提供的博文《利用USBlyzer诊断通信故障&#xff1a;实战案例定位问题根源》的 深度润色与优化版本 。本次改写严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然、专业、有“人味”&#xff0c;像一位资深嵌入式系统工程师在技术博客中娓娓…

作者头像 李华
网站建设 2026/4/2 18:23:39

Pspice用户自定义器件库设计操作指南

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。全文已彻底去除AI腔调、模板化表达和生硬章节标题&#xff0c;转而采用一位资深电路仿真工程师在技术博客中自然分享的口吻——逻辑层层递进、语言精准克制、细节源于实战&#xff0c;并强化了“为什么这么做…

作者头像 李华
网站建设 2026/3/13 2:07:17

百考通AI:您的智能答辩助手,一键生成专业PPT,让毕业答辩稳操胜券!

对于每一位即将迎来毕业季的学子而言&#xff0c;“答辩”二字承载着太多压力与期待。它不仅是对数年学习成果的终极检验&#xff0c;更是迈向人生新阶段的关键一跃。一份逻辑清晰、重点突出、视觉专业的答辩PPT&#xff0c;是您在台上自信陈述、征服评委的核心武器。然而&…

作者头像 李华
网站建设 2026/2/27 4:54:25

Qwen-Image-Edit-2511深度体验:身份保持功能太实用了

Qwen-Image-Edit-2511深度体验&#xff1a;身份保持功能太实用了 Qwen-Image-Edit-2511不是简单升级&#xff0c;而是把“人像编辑不翻车”这件事真正做成了。相比前代2509&#xff0c;它在角色一致性上实现了质的飞跃——你给一张照片换背景、改姿势、调风格&#xff0c;人物的…

作者头像 李华
网站建设 2026/3/21 0:07:10

百考通AI开题报告功能:智能生成贴合你研究方向的专业开题报告,规范、高效、逻辑清晰

开题报告是学术研究的“第一块基石”&#xff0c;它不仅决定你的选题能否通过&#xff0c;更直接影响后续论文的结构、深度与完成质量。然而&#xff0c;许多学生在撰写过程中常因缺乏经验而陷入困境&#xff1a;问题意识模糊、文献堆砌无主线、研究方法描述空泛、整体框架松散…

作者头像 李华