如果实现一客户端与服务器的交互比较容易(直接用TCP的编程流程就可以实现,只是这样写出的程序只能是一个客户端交互释放连接后其他客户端才可以与服务器交互 ),但是要实现多个客户端同时与同一服务器的交互就相对复杂一点。
我们先给出服务器处理同一客户端的多次访问的伪代码:
要实现多个客户端同时与同一服务器的交互,就要求服务器与客户端的交互要并发处理。我们就想到用多进程,或者多线程来实现。以下我们分别用多进程和多线程来实现多个客户端同时与同一服务器的交互。
多进程:启动多个进程,每个进程执行和一个客户端的交互。
1. 父进程完成与客户端的连接工作,随后创建子进程,子进程与客户端具体交互。
2.父进程需不需要把文件描述符传递给子进程?(不需要,因为在fork之前打开的文件描述符,子进程会继承父进程打开的文件描述符。)
3.父进程需不需要关闭文件描述符?(需要,父进程关闭文件描述符并没有断开连接,只是将PCB中的struct file中的引用计数-1,等子进程也关闭文件描述符时才真正断开连接。而只有子进程关闭文件描述符父进程不关闭文件描述符,系统就会一直为其维护这一文件描述符,会造成资源的浪费。)
4.防止僵尸进程,需要修改信号的响应方式。
具体代码如下:
服务器端:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<pthread.h>
#include<signal.h>
void communication(int a)
{