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



各位看官们,大家好,上一回中咱们说的是基于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循环中主要是接受客户端发来的连接请求,并且创建新的线程,创建完一个新的线程后,就进行下一次循环中,通信过程中对数据的操作则由线程调用它的线程函数来完成。此时,如果还有客户端发来连接请求,服务器就会再创建一个新线程。

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

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

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


时间: 2024-10-09 14:52:27

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

一起talk C栗子吧(第一百六十九回:C语言实例--再谈内置宏)

各位看官们,大家好,上一回中咱们说的是C语言中的布尔–bool类型的例子,这一回咱们说的例子是:再谈内置宏 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在第一百二十四回中介绍了C语言中的内置宏,当时介绍了常用的内置宏_LINE_和_FILE_.并且介绍了如何使用它们来输出它们所在位置的行号和所在的文件名.大家都知道,这两个内置宏经常被用来在文件中添加调试信息.因为我们写的程序难免会有错误,所以需要对程序进行调试.在文件中加入内置宏后,我们通过调试可以快速地找到错误发生在哪个

一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)

各位看官们,大家好,上一回中咱们说的是套接字通信模型的例子,这一回咱们说的例子是:套接字知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在前面的章回中介绍了许多关于套接字的内容,有些看官感觉知识比较乱,不断地摇头叹气,而且还在吟诗:剪不断,理还乱,是离愁.不对,是套接字.别有一番滋味在心头.哈哈.这位看官太有才了呀,连古诗也用上了.今天我和大家一起整理下套接字的知识,到时候将会是一番喜悦的滋味在心头. 看官们,我们最开始介绍的是套接字的概念,接着介绍了套接字的属性,

一起talk C栗子吧(第一百六十四回:C语言实例--const关键字)

各位看官们,大家好,上一回中咱们说的是三目运算符的例子,这一回咱们说的例子是:const关键字 .闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面章回中介绍了很多系统编程接口,在这些接口的参数中经常出现const关键字,有看官对此提出了疑问"这些const有什么用处呢?".今天,我将和大家一起来解决该疑问. 在C语言中const是一种修饰符,经常用来修饰变量.使用它修饰以后的变量,就成为常量.常量是不允许被修改的.下我们举个简单的例子来说明const的用法. 1 #inc

一起talk C栗子吧(第一百六十三回:C语言实例--三目运算符)

各位看官们,大家好,上一回中咱们说的是套接字知识体系图的例子,这一回咱们说的例子是:三目运算符.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前一章回中对套接字进行了归纳和总结,从而结束了对套接字的介绍.这一回中我们将开始介绍一个新的知识,那就是三目运算符. 说明到三目运算符,有些看官可能不知道是什么,如果我写个符号,大家一定都知道是什么"?:".啊!原来是它呀.已经有看官发出了感叹.其实,有时候我也会和大家一样,只知道使用,却不知道它叫什么,哈哈. 我们今天来介绍

一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了套接字通信过程中使用的系统调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们.今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用.这些系统调用的功能十分相似,只是在操作的细节上不相同.接下来我们分别介绍他们. 发送数据的系统调用 ssize_t send(int sockfd, const void

一起talk C栗子吧(第一百六十五回:C语言实例--C语言中的常量)

各位看官们,大家好,上一回中咱们说的const关键字的例子,这一回咱们说的例子是:C语言中的常量 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在上一回中介绍了const关键字,大家都知道被const修饰的都是常量.提到常量,我们在程序中经常使用它,这一回中我们一起看看C语言中的其它常量. 大家都知道,常量的值是固定的,而且不能被修改.在C语言中,一共有四种实现常量的方式,它们分别是: 字面常量 宏 const 枚举. 接下来我们分别介绍这四种实现常量的方式. 字面常量:字

一起talk C栗子吧(第一百六十八回:C语言实例--C语言中的布尔--bool类型)

各位看官们,大家好,上一回中咱们说的是控制终端字符颜色的例子,这一回咱们说的例子是:C语言中的布尔–bool类型 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在数字电路中我们经常会遇到布尔类型,其实在编写软件的过程中也会使用布尔类型.布尔类型的变量只有两种值:真和假.在实际的编程过程中,我们经常定义宏,然后使用1表示真,0表示假.下面是具体的例子: #define TRUE 1 #define FALSE 0 例子中定义了两个宏,一个是TRUE,它的值是1,表示真:另外一个是F

一起talk C栗子吧(第一百六十六回:C语言实例--大小写字符转换)

各位看官们,大家好,上一回中咱们说的是C语言中常量的例子,这一回咱们说的例子是:大小写字符转换.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在程序中经常会用到英文字符,有时候需要把英文字符进行大小写转换.如何进行转换呢?接下来我们一起看看具体的转换方法. 大家都知道每个字符都有相应的ASIIC码,如果把一个字符的ASIIC码加上一个数值就变成了另外一个字符的ASIIC码.比如给字符a的ASIIC码加上1后就成了字符字符b的ASIIC码.基于这个原理,我们可以在小写字符的ASIIC

第一百六十八节,jQuery,表单选择器

jQuery,表单选择器 学习要点: 1.常规选择器 2.表单选择器 3.表单过滤器 表单作为 HTML 中一种特殊的元素,操作方法较为多样性和特殊性,开发者不但可以 使用之前的常规选择器或过滤器,也可以使用 jQuery 为表单专门提供的选择器和过滤器来 准确的定位表单元素. 一.常规选择器 我们可以使用 id.类(class)和元素名来获取表单字段,如果是表单元素,都必须含有 name 属性,还可以结合属性选择器来精确定位. $('input').val(); //元素名定位,默认获取第一个