一起talk C栗子吧(第一百六十回:C语言实例--套接字通信模型一)

时间:2020-12-14 10:57:07

各位看官们,大家好,上一回中咱们说的是基于AF_INET域数据报套接字通信的例子,这一回咱们说的例子是:套接字通信模型 。闲话休提,言归正转。让我们一起talk C栗子吧!


看官们,我们在前面章回中介绍的内容中提到过通信的次数,当时只是说可以自己设置通信的次数,并没有做详细的介绍,今天我们一起来看看如何设置通信的次数,以及与它的扩展:通信模型。

迭代通信模型

看官们,通信次数的控制主要体现在服务器端,下面是核心代码:
流套接字通信

    while(index++ < 2)
    {
        client_fd = accept(server_fd,NULL,NULL);

        // read data by socket
        res = read(client_fd,buf,BUF_SIZE);

    // close socket
        res = close(client_fd);
    }

数据报套接字通信

    while(index++ < 2)
    {
        res = recvfrom(server_fd,buf,BUF_SIZE,0,(struct sockaddr *)&client_address,&addr_len);
    }

从上面的代码中,我们可以看到while循环中的(index<2)限制了通信的次数为为,如果我们写成死循环:while(1);那么就是无限次的通信。说完的通信次数, 我们对它进行扩展,也就是我们今天要介绍的主题:通信模型。

大家可以看到,通信过程中对数据的操作是在while循环中进行的,只有当前通信过程中的数据被操作完成后才能进入下一次通信过程中。从服务器的角度看,服务器每次只能和一个客户端进行通信。从客户端的角度看,只有一个客户端能与服务器通信,其它的客户端需要等待当前客户端完成通信后才能与服务器端进行通信。也就是说,多个客户端是轮流与服务器端进行通信的,我们给这种通信方式起了一个名字叫作:迭代通信模型。

并发通信模型

接下来我们介绍另外一种套接字通信模型。首先,我们修改一下核心代码,如下所示:
流套接字通信

    //线程执行函数
    void *thread_func(void *param)
    {   
        // read data by socket
        res = read(client_fd,buf,BUF_SIZE);

        // close socket
        res = close(client_fd);
    }
    while(1)
    {
        client_fd = accept(server_fd,NULL,NULL);
        res = pthread_create(&thread_value,NULL,thread_func,(void *)param);
    }

数据报套接字通信

    //线程执行函数
    void *thread_func(void *param)
    {
        res = recvfrom(server_fd,buf,BUF_SIZE,0,(struct sockaddr *)&client_address,&addr_len);
    }
    while(1)
    {
          res = pthread_create(&thread_value,NULL,thread_func,(void *)param);
    }

从上面的代码中,我们可以看到,我们引入了线程,并且把通信的次数设置为无限次,当然了,写成像迭代模型中一样的两次通信也是可以的。我们重点看一下通信过程中的变化。

通信过程中对数据的操作是在线程函数中进行的,在while循环中主要是接受客户端发来的连接请求,并且创建新的线程,创建完一个新的线程后,就进行下一次循环中,通信过程中对数据的操作则由线程调用它的线程函数来完成。此时,如果还有客户端发来连接请求,服务器就会再创建一个新线程。

从服务器的角度看,服务器可以和多个客户端进行通信。从客户端的角度看,多个客户端可以同时与服务器通信,它们不需要等待其它的客户端通信完成通信后才能与服务器端进行通信。也就是说,同一时刻,多个客户端可以与服务器端同时进行通信。我们给这种通信方式起了一个名字叫作:并发通信模型

看官们,我们就不写详细的代码了,大家可以在我们前面“四道佳肴”中的代码上进行修改,难度不大,相信大家可以完成。

各位看官,关于套接字通信模型的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。