如下图所示, 当一个客户端与服务器建立连接以后,服务器端 accept()返回,进而准备循环接收客户端发过来的数据。
如果客户端暂时没发数据,服务端会在 recv()阻塞。此时,其他客户端向服务器发起连接后,由于服务器阻塞了,无法执行 accept()接受连接,也就是其他客户端发送的数据,服务器无法读取。服务器也就无法并发同时处理多个客户端。
这个问题可以通过引入多线程和多进程来解决。 服务端接受一个客户端的连接后,创建一个线程或者进程,然后在新创建的线程或进程中循环处理数据。主线程(父进程)只负责监听客户端的连接,并使用 accept()接受连接,不进行数据的处理。如下图所示:
多线程处理并发的服务器端示例代码 MultiThread.c 如下:
#include <stdio.h> // 引入标准输入输出头文件
#include <stdlib.h> // 引入标准库头文件
#include <unistd.h> // 引入Unix标准函数定义头文件
#include <string.h> // 引入字符串处理头文件
#include <assert.h> // 引入断言头文件
#include <sys/socket.h> // 引入套接字接口头文件
#include <netinet/in.h> // 引入互联网地址族头文件
#include <arpa/inet.h> // 引入互联网定义头文件
#include <pthread.h> // 引入POSIX线程头文件v