之前学习了UDP编程,UDP是可以实现多个用户向一个用户发送的,但是TCP一个服务端在同一时刻只能对应一个客户端,因为TCP的通信是使用管道通信的,如果要使用TCP实现一对多的通信,有如下几种办法:多进程,多线程,线程池和IO多路复用。多线程和多进程就是每次服务端和客户端连接的时候,都去产生一个子进程或者线程,然后在该进程或者线程里面实现服务端与客户端的通信,如果使用的是进程,要主要对SIGCHLD信号的捕获,回收子进程的空间。如果使用的是线程,则要在创建该线程时为其设置分离属性,让主进程不用等待线程结束,而是让线程结束之后自动回收空间。
还有就是使用线程池,线程池是事先就创建好一些线程,然后当客户端和服务端建立通道之后将通信套接字放入一个队列中,然后让之前创建的线程去从队列中取出套接字,实现通信,本质上还是多线程编程。
还有一种就是多路IO复用,这就相当于一个服务员在几桌客人之前轮流服务,我们需要使用select函数,来检测目前的套接字是否需要响应,程序的套接字都放在fd_set结构体之中,使用select时需要将该结构体的地址传入,内核就对这些存在的套接字进行检查,如果需要响应,就将需要响应的套接字返回在之前的fd_set结构体中,然后通过遍历该结构体内的所有套接字,来对需要响应的套接字做出对应的操作。