我裂开了--多线程并发服务器

多线程服务器的工作模式图如下在这里插入图片描述
整个程序可以通过三个函数来实现

&主函数
创建socket,绑定地址,监听套接字直到接收到新客户端连接时
开始调用thread_start函数

&thread_start函数
初始化线程并创建线程,并将thread_worker函数所需要的参数通过传参给pthread_create函数(用来创建子线程)从主函数传给thread_worker函数

&thread_worker函数
实现子线程所要实现的功能,即从客户端读取字符并将读到的字符转换为大写后回复给客户端

下面为程序的具体实现

主函数部分
首先调用socket函数生成sockfd
在这里插入图片描述
随时判断返回值检查各步骤进行状况
调用setsockopt函数避免端口占用

开始对bind函数参数进行初始化在这里插入图片描述
提前定义结构体struct sockaddr_in类型结构体serv_addr储存数据
首先调用memset函数对结构体进行清零避免出现随机值
调用bind函数绑定端口在这里插入图片描述
调用accept函数监听端口在这里插入图片描述
当监听到有客户端接入时,线程开始分裂
主函数部分结束
/

thread_start函数部分
/*thread_start函数为int类型,主要作用是对线程初始化并创建线程,需要传递三个参数供pthread_create函数使用在这里插入图片描述
首先定义pthread_attr_t 类型参数thread_attr储存线程属性
之后开始对线程属性进行初始化在这里插入图片描述
首先调用pthread_attr_init函数对其进行初始化
再调用pthread_attr_setstacksize函数设置线程的栈大小为120k
再调用pthread_attr_setdetachstate函数设置线程与父进程为相分离状态
随后调用pthread_create函数创建线程在这里插入图片描述
pthread_create函数原型如下在这里插入图片描述
pthread_ create()用来创建一个线程, 并执行第三个参数start_ routine所指向的函数
●第一个参数thread是一 个pthread t类型的指针,他用来返回该线程的线程ID。每个线程都能够通过pthread self()来获取自己的线程ID (pthread_ t类型)
●第二个参数是线程的属性,其类型是pthread_ attr t类型,其定义如下:在这里插入图片描述
●第三个参数start routine是一 个函数指针,它指向的函数原型是void *func(void *), 这是所创建的子线程要执行的任务 (函数)
●第四个参数arg就是传给了所调用的函数的参数,如果有多个参数需要传递给子线程则需要封装到一个结构体里传进去

thread_start函数部分结束

thread_worker函数部分在这里插入图片描述
因pthread_create函数所包含的函数指针所指向的函数原型为void类型且传给此函数的参数也为void类型,所有定义此函数及其参数均为void类型,传参后进行强制类型转换在这里插入图片描述
传参后首先判断参数有没有正常传入,若没有则终止进程,需要注意的是thread_worker函数为void
类型因此此函数中不能调用return,也不可调用exit函数,多线程编程时在程序任意位置调用exit函数都会导致整个进程退出在这里插入图片描述
随即进行结构体强制类型转换,void*类型指针理论上可以强制转换为任意类型的指针在这里插入图片描述
调用read函数从客户端读数据到缓冲区中并判断read函数的返回值(一定要提前清空缓冲区),若返回值小于0代表函数出错,若等于零则代表客户端连接断开,若返回值大于0则为从客户端读取的字节数在这里插入图片描述
这里实现一个将客户端发来的字母小写转大写的简易功能,用for函数对读到缓冲区的字符进行遍历并调用toupper函数将其转换为大写
之后调用write函数将转换后的字符从缓冲区写入客户端,类似于read函数,write函数返回值小于0为出错,大于0则为写入的字节数
thread_worker函数结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值