Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)

  • 一、TCP服务器(一请求一线程) 的原理
  • 二、完整代码
  • 三、测试
  • 四、补充

一、TCP服务器(一请求一线程) 的原理

通过sockfd绑定(bind)和监听(listen),每过来一个客户端就接受(accept),并创建一个clientfd,每个clientfd,占据一个线程。
每个线程执行 接受(recv)并printf的任务。


具体的监听过程

二、完整代码

#include<sys/socket.h>
#include<arpa/inet.h>#include<stdio.h>
#include<stdlib.h>
#include<string.h>#include<pthread.h>
#include<unistd.h>#define BUFFER_LENGTH 1024void* client_routine(void* arg){int clientfd=*(int*)arg;while(1){char buffer[BUFFER_LENGTH]={0};int len=recv(clientfd,buffer,BUFFER_LENGTH,0);//阻塞就会挂起if(len<0){//阻塞io不存在len<0因为它会挂起在recv时刻,一旦发生,就说明出错了close(clientfd);break;}else if(len==0){//disconnect (读取数据为0就说明客户端断开连接了)close(clientfd);break;}else{printf("Recv:%s,%d bytes\n",buffer,len);}}
}int main(int argc,char** argv){if(argc<2){printf("Param Error\n");return -1;}int port=atoi(argv[1]);int sockfd=socket(AF_INET,SOCK_STREAM,0);sockaddr_in addr;memset(&addr,0,sizeof(sockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=INADDR_ANY;//0.0.0.0 泛指本机的意思if(bind(sockfd,(sockaddr*)&addr,sizeof(sockaddr_in))<0){//绑定perror("bind");return 2;}if(listen(sockfd,5)<0){//监听(最多可以排队5个)perror("listen");return 3;}//一请求 一线程while(1){sockaddr_in client_addr;memset(&client_addr,0,sizeof(sockaddr_in));socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd,(sockaddr*)&client_addr,&client_len);//接受一个客户,并将它的ip存到client_addr中,并形成了一个客户端fdpthread_t thread_id;pthread_create(&thread_id,NULL,client_routine,&clientfd);//为每个clientfd分配一个线程}return 0;
}

编译指令

g++ tcp_sever.cpp -o tcp_sever -lpthread

三、测试

执行,设置服务器端口为8888

 ./tcp_server 8888

打开NetAssist.exe
选择TCP Client,远程主机是自己的服务器的ip:端口号

点击连接

然后在下方可以发送数据了,点击发送

在服务器端可以接受到数据

四、补充

多个客户端,如何区分哪个客户端发送的?
sockfd是解决不了的
通过定义应用协议来解决,比如说在发送的同时也发送 用户id

一请求一线程 的缺点:
随着客户端越来越多 (比如100w)
不合适用一请求一线程的方式。
posix thread 8M。 1G内存 —》128个。比较有限。

现在已经弃用了,而选用epoll的方式

Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)相关推荐

  1. Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数

    Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数 Polyworks采用了脚本语言作为二次开发的工具,因此语言格式上非常规范和统一.其中一个重要的特点就是,几乎所有的对象都 ...

  2. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  3. ((ios开发学习笔记 十一))自定义TableViewCell 的方式实现自定义TableView(带源码)...

    实现的效果 实现过程 Step One 创建 自定义TableViewCell (接口部分)  (类实现部分)  xib 实现部分 注意: 下面三个设置 1 设置xib文件的class 2设置Iden ...

  4. Golang 学习笔记3:Go 并发与网络

    目录 13,Go 错误处理 1,error 接口 2,panic 异常 3,defer 函数 14,Go 并发 1,goroutine 2,channel 3,无缓冲 channel 的惯用法 4,有 ...

  5. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十一课:Cocos2D-X网格特效1-3

    [麦可网]Cocos2d-X跨平台游戏开发---学习笔记 第二十一课:Cocos2D-X网格特效1-3 ================================================ ...

  6. Zynq-7000系列之linux开发学习笔记:编译Linux内核和制作设备树(六)

    开发板:Zynq7030数据采集板 PC平台:Ubuntu-18.04 + MobaXterm 开发环境:Xilinx Vivado + SDK -18.3 交叉编译工具:arm-linux-gnue ...

  7. Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令

    Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 文章目录 Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 info server info clie ...

  8. Go语言开发学习笔记(持续更新中)

    Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...

  9. FFmpeg基础到工程-多路H265监控录放开发学习笔记

    多路H265监控录放开发学习笔记 课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等.包括:音视频.流媒体.直播.Android.视频监控28181.等. 具体 ...

最新文章

  1. numpy中ravel函数、flatten函数的功能及差异
  2. python表达式3and not5的值_太原理工大学python考试题总结
  3. Kooboo 全文索引研究
  4. boost::spirit模块实现演示语法的普通计算器示例
  5. 【百度分享】基于内核模块的测试代码编写(二)
  6. HBase中的HMaster、HRegionServer、Zookeeper
  7. photoshop常用快捷键大全
  8. Angular 小试牛刀[2]:CI(travie+firebase)
  9. 网络操作系统第224页作业
  10. pdfobject.js和pdf.js的详解
  11. 股票开户天载钢铁等板块跌幅居前
  12. Tekla二次开发 第4节 曲梁及双截面梁
  13. 2014蓝桥杯C++A组——史丰收速算
  14. (超详细) eclispe如何连接SQL Server2019(通过JDBC驱动包连接)
  15. 微信小程序头像上传(一)
  16. WSL2 安装 CUDA(Win11)
  17. 各个厂商手机不打印log日志的解决方法
  18. 【软件构造】LAB1实验报告
  19. cad怎样转换成pdf格式?四个步骤完成
  20. GDUT 2.25 D

热门文章

  1. 数据分组合并有妙招!看如何处理同类项
  2. sql 查询重复数据大于2条以上的_「干货」关于SQL书写建议 索引优化的总结,你值得拥有...
  3. C# 常量、变量介绍
  4. Java核心特性之反射机制
  5. 基于python包sentinelsat的Sentinel-2数据下载
  6. 2021年浙江大学MBA考研复试真题分享
  7. 批量处理DataFrame行数据(pandas)
  8. java 16进制 累加,java 16进制求和示例
  9. VOS通话过程中无声的处理办法
  10. nordic52832+SDK15.2+TIMESLOT 实现ble 与2.4g射频一起工作。