为您推荐:
精华内容
最热下载
问答
  • 5星
    30.03MB qq_27352959 2021-02-22 08:02:46
  • 5星
    130KB weixin_44510615 2021-07-02 14:32:28
  • 3星
    949KB weixin_44573410 2021-02-05 20:52:44
  • 5星
    12KB u014627020 2020-11-24 18:16:41
  • 5星
    5.22MB GJZGRB 2021-03-10 14:25:58
  • 5星
    1.94MB weixin_44573410 2021-03-01 13:56:44
  • 5星
    2.74MB weixin_44573410 2021-03-02 23:33:19
  • 5星
    19.69MB muyeseocom 2021-09-15 11:43:12
  • 5星
    1.22MB Johnho130 2021-09-02 15:38:08
  • 5星
    206.62MB u013729183 2021-08-14 08:53:28
  • 1.@RequestMapping定义请求规则 1.1 指定模块名称 通过 @RequestMapping 注解可以定义控制器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。 @...

    文章目录:

    1.@RequestMapping定义请求规则

    1.1 指定模块名称

    1.2 对请求提交方式的定义

    1.3 以上两种规则的小实例 

    2.控制器接收请求参数的三种方式

    2.1 逐个接收请求参数:请求中的参数名和控制器方法的形参名一样

    2.2 逐个接收请求参数:请求中的参数名和控制器方法的形参名不一样

    2.3 对象接收请求参数:对象的属性名和控制器方法的形参名一样

    2.4 以上三种形式的小实例 

    2.4.1 第一种情况的运行结果

    2.4.2 第二种情况的运行结果

    2.4.3 第三种情况的运行结果


    1.@RequestMapping定义请求规则

    1.1 指定模块名称

    通过 @RequestMapping 注解可以定义控制器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。

    @RequestMapping 的 value 属性用于定义所匹配请求的 URI。但对于注解在方法上与类上,其 value 属性所指定的 URI,意义是不同的。
    一个 @Controller 所注解的类中,可以定义多个控制器方法。当然,不同的处理器方法所匹配的 URI 是不同的。这些不同的 URI 被指定在注解于方法之上的 @RequestMapping 的 value 属性中。但若这些请求具有相同的 URI 部分,则这些相同的 URI,可以被抽取到注解在类之上的 @RequestMapping 的value 属性中。此时的这个 URI 表示模块的名称。URI 的请求是相对于 Web 的根目录。

    换个角度说,要访问控制器的指定方法,必须要在方法指定 URI 之前加上处理器类前定义的模块名称。

    1.2 对请求提交方式的定义

    对于 @RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。

    Method 属性的取值为 RequestMethod 枚举常量。常用的为 RequestMethod.GET 与 RequestMethod.POST,分别表示提交方式的匹配
    规则为 GET 与 POST 提交。

    也就是说,只要指定了处理器方法匹配的请求提交方式为 POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用 AJAX 请求。其它请求方式被禁用。

    当然,若不指定 method 属性,则无论是 GET 还是 POST 提交方式,均可匹配。即对于请求的提交方式无要求。

    1.3 以上两种规则的小实例 

    package com.songzihao.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     *  @Controller: 创建控制器对象
     *  控制器: 叫作后端控制器,自定义的类处理请求的
     *  位置: 在类的上面,表示创建此类的对象,对象放在springmvc容器中
     *
     *  @RequestMapping
     *  属性: value,表示所有请求地址的公共前缀,相当于是模块名称
     *  位置: 在类的上面
     */
    @Controller
    @RequestMapping(value = "/test")
    public class MyController {
    
        /**
         *  定义方法,处理请求.相当于之前servlet中的doGet()
         *  springmvc框架,使用控制器类中的方法,处理请求
         *  1.方法的形参: 表示请求中的参数
         *  2.方法的返回值: 表示本次请求的处理结果
         *
         *  @RequestMapping: 请求映射
         *  属性: value,请求中的uri地址,唯一值,以"/"开头
         *       method,请求的方式,使用RequestMethod类的枚举值
         *  位置: 1) 在方法的上面(必须)   2) 在类定义的上面(可选)
         *  作用: 把指定的请求交给指定的方法处理
         */
        //指定some.do的请求方式:method = RequestMethod.XXXX
        @RequestMapping(value = {"/some.do"},method = RequestMethod.GET)
        public ModelAndView doSome() {
            System.out.println("执行了MyController的doSome()方法");
            //使用这个方法处理请求,能处理请求的方法叫作控制器方法
            ModelAndView mv=new ModelAndView();
            //添加数据
            mv.addObject("msg","处理了some.do的请求");
            mv.addObject("fun","执行了doSome()方法");
            //指定视图
            mv.setViewName("/WEB-INF/view/show.jsp");
            //返回结果
            return mv;
        }
    
        //指定first.do的请求方式:method = RequestMethod.XXXX
        @RequestMapping(value = "/first.do",method = RequestMethod.POST)
        public ModelAndView doFirst() {
            System.out.println("执行了MyController的doFirst()方法");
            ModelAndView mv=new ModelAndView();
            mv.addObject("msg","处理了first.do的请求");
            mv.addObject("fun","执行了doFirst()方法");
            mv.setViewName("/WEB-INF/view/show.jsp");
            return mv;
        }
    
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- springmvc的配置文件 -->
        <!-- 声明组件扫描器 -->
        <context:component-scan base-package="com.songzihao.controller" />
    
    </beans>
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- 声明springmvc的核心对象 -->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 自定义配置文件的位置 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- tomcat服务器创建对象的顺序,数值(大于等于0)越小,创建对象的时间就越早 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <!--
                把一些请求交给指定的servlet处理
                1.使用扩展名方式,格式:*.xxx, xxx是自定义的扩展名
                  例如:*.do  *.action  *.mvc , 不能使用 *.jsp!!!
                2.使用斜杠 "/"
            -->
            <!-- 意思是将 *.do 的请求交给 DispatcherServlet 处理 -->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    
    </web-app>
    <%@ page contentType="text/html;charset=utf-8" language="java" %>
    <html>
    <head>
        <title>请求方式</title>
    </head>
    <body>
        <a href="test/some.do">发起test/some.do的请求,get方式</a>
        <br/>
        <form action="test/some.do" method="get">
            <input type="submit" value="get请求方式">
        </form>
        <a href="test/first.do">发起test/first.do的请求,post方式</a>
        <br/>
        <form action="test/first.do" method="post">
            <input type="submit" value="post请求方式">
        </form>
    </body>
    </html>
    
    <%@ page contentType="text/html;charset=utf-8" language="java" %>
    <html>
    <head>
        <title>show</title>
    </head>
    <body>
        /WEB-INF/view/show.jsp,显示request作用域中的数据<br/>
        <h3>msg数据:<%=request.getAttribute("msg")%></h3>
        <h3>fun数据:${fun}</h3>
    </body>
    </html>


    2.控制器接收请求参数的三种方式

    处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。

    1.HttpServletRequest

    2.HttpServletResponse

    3.HttpSession

    4.请求中所携带的请求参数

    2.1 逐个接收请求参数:请求中的参数名和控制器方法的形参名一样

    /**
     *  逐个接收请求参数
     *  要求:请求中的参数名和控制器方法的形参名一样,按名称对象接受请求参数
     *
     *  参数接收:
     *  1.框架使用request对象,接收参数
     *    String name=request.getParameter("name");
     *    String age=request.getParameter("age");
     *  2.在中央调度器的内部调用doPropertyParam方法时,按名称对象传递参数,可以实现数据类型的转换
     *    doPropertyParam(String name,Integer.valueOf(age))
     */
    

    2.2 逐个接收请求参数:请求中的参数名和控制器方法的形参名不一样

    /**
     *  逐个接收请求参数
     *  要求:请求中的参数名和控制器方法的形参名不一样
     *  @RequestParam: 解决名称不一样的问题
     *            属性: value,请求中的参数名
     *            属性: required,boolean类型的,默认是true
     *                          true表示请求中必须有此参数,否则报错
     *                          false表示请求中可以没有此参数,不会报错
     *            位置: 在形参名定义的前面
     */

    2.3 对象接收请求参数:对象的属性名和控制器方法的形参名一样

    /**
     *  对象接收请求参数
     *  要求: 对象的属性名和控制器方法的形参名一样
     *       Java类中需要有一个无参构造方法,属性有set方法
     *  框架的处理: 1.调用Student的无参构造方法,创建对象
     *            2.调用对象属性的set方法,同名的参数调用对应的set方法。
     */
    

    2.4 以上三种形式的小实例 

    package com.songzihao.controller;
    
    import com.songzihao.entity.Student;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    public class MyController {
    
        /**
         *  逐个接收请求参数
         *  要求:请求中的参数名和控制器方法的形参名一样,按名称对象接受请求参数
         *
         *  参数接收:
         *  1.框架使用request对象,接收参数
         *    String name=request.getParameter("name");
         *    String age=request.getParameter("age");
         *  2.在中央调度器的内部调用doPropertyParam方法时,按名称对象传递参数,可以实现数据类型的转换
         *    doPropertyParam(String name,Integer.valueOf(age))
         */
        @RequestMapping(value = {"/receive-param.do"})
        public ModelAndView doPropertyParam(String name,Integer age) {
            System.out.println("执行了MyController的doPropertyParam方法,name=" + name + ",age=" + age);
            ModelAndView mv=new ModelAndView();
            mv.addObject("myName",name);
            mv.addObject("myAge",age);
            mv.setViewName("/WEB-INF/view/show.jsp");
            return mv;
        }
    
        /**
         *  逐个接收请求参数
         *  要求:请求中的参数名和控制器方法的形参名不一样
         *  @RequestParam: 解决名称不一样的问题
         *            属性: value,请求中的参数名
         *            属性: required,boolean类型的,默认是true
         *                          true表示请求中必须有此参数,否则报错
         *                          false表示请求中可以没有此参数,不会报错
         *            位置: 在形参名定义的前面
         */
        @RequestMapping(value = "/receive-property.do")
        public ModelAndView doReceiveParam(@RequestParam(value = "sname",required = false) String name,
                                           @RequestParam(value = "sage",required = false) String age) {
            System.out.println("执行了MyController的doReceiveParam方法,name=" + name + ",age=" + age);
            ModelAndView mv=new ModelAndView();
            mv.addObject("myName",name);
            mv.addObject("myAge",age);
            mv.setViewName("/WEB-INF/view/show.jsp");
            return mv;
        }
    
        /**
         *  对象接收请求参数
         *  要求: 对象的属性名和控制器方法的形参名一样
         *       Java类中需要有一个无参构造方法,属性有set方法
         *  框架的处理: 1.调用Student的无参构造方法,创建对象
         *            2.调用对象属性的set方法,同名的参数调用对应的set方法。
         */
        @RequestMapping(value = "/receive-object.do")
        public ModelAndView doReceiveObject(Student student) {
            System.out.println("执行了MyController的doReceiveObject方法=" + student);
            ModelAndView mv=new ModelAndView();
            mv.addObject("myName",student.getName());
            mv.addObject("myAge",student.getAge());
            mv.setViewName("/WEB-INF/view/show.jsp");
            return mv;
        }
    
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- springmvc的配置文件 -->
        <!-- 声明组件扫描器 -->
        <context:component-scan base-package="com.songzihao.controller" />
    
    </beans>
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- 声明springmvc的核心对象 -->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 自定义配置文件的位置 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- tomcat服务器创建对象的顺序,数值(大于等于0)越小,创建对象的时间就越早 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <!--
                把一些请求交给指定的servlet处理
                1.使用扩展名方式,格式:*.xxx, xxx是自定义的扩展名
                  例如:*.do  *.action  *.mvc , 不能使用 *.jsp!!!
                2.使用斜杠 "/"
            -->
            <!-- 意思是将 *.do 的请求交给 DispatcherServlet 处理 -->
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
        
        <!-- 声明过滤器,框架提供的,解决post请求中乱码的问题 -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <!-- 给过滤器属性赋值 -->
            <init-param>
                <!-- 项目使用的字符集编码 -->
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
            <init-param>
                <!-- 强制请求对象request使用encoding的编码方式 -->
                <param-name>forceRequestEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
            <init-param>
                <!-- 强制响应对象response使用encoding的编码方式 -->
                <param-name>forceResponseEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <!-- 强制所有请求,先经过过滤器处理 -->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>
    <%@ page contentType="text/html;charset=utf-8" language="java" %>
    <html>
    <head>
        <title>接受请求参数</title>
    </head>
    <body>
        <p>逐个接收请求参数: 请求中参数名和形参名一样</p>
        <form action="receive-param.do" method="post">
            姓名:<input type="text" name="name"><br/>
            年龄:<input type="text" name="age"><br/>
            <input type="submit" value="提交参数">
        </form>
    
        <br/><br/>
        <p>逐个接收请求参数: 请求中参数名和形参名不一样</p>
        <form action="receive-property.do" method="post">
            姓名:<input type="text" name="sname"><br/>
            年龄:<input type="text" name="sage"><br/>
            <input type="submit" value="提交参数">
        </form>
    
        <br/><br/>
        <p>对象接收请求参数: 请求中参数名和对象的属性名一样</p>
        <form action="receive-object.do" method="post">
            姓名:<input type="text" name="name"><br/>
            年龄:<input type="text" name="age"><br/>
            <input type="submit" value="提交参数">
        </form>
    </body>
    </html>
    
    <%@ page contentType="text/html;charset=utf-8" language="java" %>
    <html>
    <head>
        <title>show</title>
    </head>
    <body>
        /WEB-INF/view/show.jsp,显示request作用域中的数据<br/>
        <h3>myName:${myName}</h3>
        <h3>myAge:${myAge}</h3>
    </body>
    </html>

    2.4.1 第一种情况的运行结果

    2.4.2 第二种情况的运行结果

    2.4.3 第三种情况的运行结果

     

    展开全文
    weixin_43823808 2021-03-28 14:34:24
  • 一、RS232基础知识计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路...RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。RS-232-C是美...
    8fda7dc5d55966938761f5b2df3976a2.png

    一、RS232基础知识

    计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。

    在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。

    RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数,代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。

    4be8fd6be84821aae541156190767d0c.png

    1、电气特性

    EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。

    在TxD和RxD上:逻辑1(MARK)=-3V~-15V ,逻辑0(SPACE)=+3~+15V 在RTS、CTS、DSR、DTR和DCD等控制线上:信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压)=-3V~-15V

    根据设备供电电源的不同,+-5、+-10、+-12和+-15这样的电平都是可能的。

    2、连接器的机械特性

    由于RS-232C并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9各种类型的连接器,其引脚的定义也各不相同。最近,8管脚的RJ-45型连接器变得越来越普遍,尽管它的管脚分配相差很大。EIA/TIA 561标准规定了一种管脚分配的方法,但是由Dave Yost发明的被广泛使用在Unix计算机上的Yost串连设备配线标准 ('Yost Serial Device Wiring Standard')以及其他很多设备都没有采用上述任一种连线标准。下表中列出的是被较多使用的RS-232中的信号和管脚分配:

    809bc49037e6ca61904f2c4e404c06a2.png

    信号的标注是从DTE设备的角度出发的,TD、DTR和RTS信号是由DTE产生的,RD、DSR、CTS、DCD和RI信号是由DCE产生的。

    PC 机的RS-232 口为9 芯针插座。一些设备与PC 机连接的RS-232 接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据TXD”、“接收数据RXD”和“信号地GND”。

    94fe4cf80059e2d6f1f5b9cb7d10ae4b.png

    双向接口能够只需要3根线制作是因为RS-232的所有信号都共享一个公共接地。非平衡电路使得RS-232非常的容易受两设备间基点电压偏移的影响。对于信号的上升期和下降期,RS-232也只有相对较差的控制能力,很容易发生串话的问题。RS-232被推荐在短距离(15m以内)间通信。由于非对称电路的关系,RS-232接口电缆通常不是由双绞线制作的。

    3、传输电缆

    RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特,驱动器允许有2500pF的电容负载,通信距离将受此电容限制。

    例如,采用150pF/m的通信电缆时,最大通信距离为15m;若每米电缆的电容量减小,通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送,存在共地噪声和不能抑制共模干扰等问题,因此一般用于20m以内的通信。

    由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应为50 英尺,其实这个4%的码元畸变是很保守的,在实际应用中,约有99%的用户是按码元畸变10-20%的范围工作的,所以实际使用中最大距离会远超过50英尺,美国DEC公司曾规定允许码元畸变为10%而得出下面实验结果。其中1 号电缆为屏蔽电缆,型号为DECP.NO.9107723 内有三对双绞线,每对由22# AWG 组成,其外覆以屏蔽网。2 号电缆为不带屏蔽的电缆。型号为DECP.NO.9105856-04是22#AWG 的四芯电缆。

    3b18651555b63663b5bbc53a9928ca15.png

    4、链路层

    在RS-232标准中,字符是以一系列位元来一个接一个的传输。最长用的编码格式是异步起停asynchronous start-stop格式,它使用一个起始位后面紧跟7或8 个数据比特,这个可能是奇偶位,然后是两个停止位。所以发送一个字符需要10比特,带来的一个好的效果是使全部的传输速率,发送信号的速率以10分划。

    串行通信在软件设置里需要做多项设置,最常见的设置包括波特率、奇偶校验和停止位。波特率是指从一设备发到另一设备的波特率,即每秒钟多少比特bits per second (bit/s)。典型的波特率是300、1200、2400、9600、19200等bit/s。一般通信两端设备都要设为相同的波特率,但有些设备也可以设置为自动检测波特率。

    奇偶校验Parity是用来验证数据的正确性。奇偶校验一般不用,如果使用,那么既可以做奇校验也可以做偶校验。奇偶校验是通过修改每一发送字节(也可以限制发送的字节)来工作的。如果不作奇偶校验,那么数据是不会被改变的。在偶校验中,因为奇偶校验位会被相应的置1或0(一般是最高位或最低位),所以数据会被改变以使得所有传送的数位(含字符的各数位和校验位)中“1”的个数为偶数;在奇校验中,所有传送的数位(含字符的各数位和校验位)中“1”的个数为奇数。奇偶校验可以用于接受方检查传输是否发送生错误——如果某一字节中“1”的个数发生了错误,那么这个字节在传输中一定有错误发生。如果奇偶校验是正确的,那么要么没有发生错误要么发生了偶数个的错误。

    68bb1f1fdd1401e911c3232522b413b9.png

    停止位是在每个字节传输之后发送的,它用来帮助接受信号方硬件重同步。

    在串行通信软件设置中D/P/S是常规的符号表示。8/N/1(非常普遍)表明8bit数据,没有奇偶校验,1bit停止位。数据位可以设置为7、8或者9,奇偶校验位可以设置为无(N)、奇(O)或者偶(E),奇偶校验位可以使用数据中的比特位,所以8/E/1就表示一共8位数据位,其中一位用来做奇偶校验位。停止位可以是1、1.5或者2位的(1.5是用在波特率为60wpm的电传打字机上的)。

    5、传输控制

    当需要发送握手信号或数据完整性检测时需要制定其他设置。公用的组合有RTS/CTS,DTR/DSR或者XON/XOFF(实际中不使用连接器管脚而在数据流内插入特殊字符)。

    接受方把XON/XOFF信号发给发送方来控制发送方何时发送数据,这些信号是与发送数据的传输方向相反的。XON信号告诉发送方接受方准备好接受更多的数据,XOFF信号告诉发送方停止发送数据直到知道接受方再次准备好。XON/XOFF一般不赞成使用,推荐用RTS/CTS控制流来代替它们。

    XON/XOFF是一种工作在终端间的带内方法,但是必须两端都支持这个协议,而且在突然启动的时候会有混淆的可能。

    XON/XOFF可以工作于3线的接口。RTS/CTS最初是设计为电传打字机和调制解调器半双工协作通信的,每次它只能一方调制解调器发送数据。终端必须发送请求发送信号然后等到调制解调器回应清除发送信号。尽管RTS/CTS是通过硬件达到握手,但它有自己的优势。

    6、RS-232标准的不足

    经过许多年来RS-232 器件以及通信技术的改进,RS-232 的通信距离已经大大增加。由于RS-232 接口标准出现较早,难免有不足之处,主要有以下四点:

    (1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL 电路连接。

    (2) 传输速率较低,在异步传输时,波特率为20Kbps。现在由于采用新的UART 芯片16C550 等,波特率达到115.2Kbps。

    (3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

    (4) 传输距离有限,最大传输距离标准值为50 米,实际上也只能用在15米左右。

    二、RS485基础知识

    针对RS-232串口标准的局限性,人们又提出了RS-422,RS-485接口标准。RS-485/422采用平衡发送和差分接收方式实现通信:发送端将串行口的TTL电平信号转换成差分信号A、B两路输出,经过线缆传输之后在接收端将差分信号还原成TTL电平信号。由于传输线通常使用双绞线,又是差分传输,所以又极强的抗共模干扰的能力,总线收发器灵敏度很高,可以检测到低至200mV电压。故传输信号在千米之外都是可以恢复。

    1、RS-485 的电气特性

    驱动器能输出±7V的共模电压

    接收器的输入电阻RIN≥12kΩ

    输入端的电容≤50pF 在节点数为32个,配置了120Ω的终端电阻的情况下,驱动器至少还能输出电压1.5V(终端电阻的大小与所用双绞线的参数有关) 发送端:逻辑'1'以两线间的电压差为+(2 至6) V 表示;逻辑'0'以两线间的电压差为-(2 至6)V 表示。接收器的输入灵敏度为200mV(即(V+)-(V-)≥0.2V,表示信号'0';(V+)-(V-)≤-0.2V,表示信号'1')

    2、传输速率与传输距离

    RS-485 的数据最高传输速率为10Mbps,最大的通信距离约为1219M,传输速率与传输距离成反比,在10Kb/S的传输速率下,才可以达到最大的通信距离。

    但是由于RS-485 常常要与PC 机的RS-232口通信,所以实际上一般最高115.2Kbps。又由于太高的速率会使RS-485 传输距离减小,所以往往为9600bps 左右或以下。

    3、网络拓扑

    RS-485 接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。RS-485采用半双工工作方式,支持多点数据通信。

    RS-485总线网络拓扑一般采用终端匹配的总线型结构。即采用一条总线将各个节点串接起来,不支持环形或星型网络。如果需要使用星型结构,就必须使用485中继器或者485集线器才可以。RS-485/422总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

    4e19c5c088f467cae89ed63c98a44331.png

    4、连接器

    RS-485 的国际标准并没有规定RS485 的接口连接器标准、所以采用接线端子或者DB-9、DB-25 等连接器都可以。

    三、RS422基础知识

    RS-422 的电气性能与RS-485近似一样。主要的区别在于:

    (1)RS-485 有2 根信号线:发送和接收都是A 和B。由于RS-485 的收与发是共用两根线,所以不能够同时收和发(半双工)。

    (2)RS-422 有4 根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422 的收与发是分开的,所以可以同时收和发(全双工)。

    (3)支持多机通信的RS-422将Y-A 短接作为RS-485 的A、将RS-422 的Z-B 短接作为RS-485 的B可以这样简单转换为RS-485。

    f719396f68759a1fb74f7c3d1b8cc396.png

    很多人往往都误认为RS-422串行接口是RS-485串行接口的全双工版本,实际上,它们在电器特性上存在着不少差异,共模电压范围和接收器输入电阻不同使得该两个标准适用于不同的应用领域。RS-485串行接口的驱动器可用于RS-422串行接口的应用中,因为RS-485串行接口满足所有的RS-422串行接口性能参数,反之则不能成立。对于RS-485串行接口的驱动器,共模电压的输出范围是-7V和+12V之间;对于RS-422串行接口的驱动器,该项性能指标仅有±7V。RS-422串行接口接收器的最小输入电阻是4KΩ;而RS-485串行接口接收器的最小输入电阻则是12KΩ。

    四、串口基础知识

    串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

    串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

    caa796ff1a10596f7fa8b4af6b37e4aa.png

    串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:

    1、波特率

    这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

    2、数据位

    这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

    3、停止位

    用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。4、奇偶校验位

    在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    五、握手基础知识

    RS-232通行方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定时采用使用相同的波特率。尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制。这时需要串口的握手功能。在这一部分,我们讨论三种最常用的RS-232握手形式:软件握手、硬件握手和Xmodem。

    1、软件握手

    我们讨论的第一种握手是软件握手。通常用在实际数据是控制字符的情况,类似于GPIB使用命令字符串的方式。必须的线仍然是三根:Tx、Rx和地线,因为控制字符在传输线上和普通字符没有区别,函数SetXModem允许用户使能或者禁止用户使用两个控制字符XON和OXFF。这些字符在通信中由接收方发送,使发送方暂停。

    8ddbd071f8f71f2c70739929304747e9.png

    例如:假设发送方以高波特率发送数据。在传输中,接收方发现由于CPU忙于其他工作,输入buffer已经满了。为了暂时停止传输,接收方发送XOFF,典型的值是十进制19,即十六进制13,直到输入buffer空了。一旦接收方准备好接收,它发送XON,典型的值是十进制17,即十六进制11,继续通信。输入buffer半满时,LabWindows发送XOFF。此外,如果XOFF传输被打断,LabWindows会在buffer达到75%和90%时发送XOFF。显然,发送方必须遵循此守则以保证传输继续。

    2、硬件握手

    第二种是使用硬件线握手。和Tx和Rx线一样,RTS/CTS和DTR/DSR一起工作,一个作为输出,另一个作为输入。第一组线是RTS (Request to Send)和CTS(Clear to Send)。当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。另一组线是DTR(Data Terminal Ready)和DSR(Data Set Ready)。这些现主要用于Modem通信。使得串口和Modem通信他们的状态。例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。读取DSR线置高,PC机开始发送数据。一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。

    98cb8e564270daddb1ce1afb693cb256.png

    在LabWindows,函数SetCTSMode使能或者禁止使用硬件握手。如果CTS模式使能,LabWindows使用如下规则:当PC发送数据:RS-232库必须检测CTS线高后才能发送数据。当PC接收数据:如果端口打开,且输入队列有空接收数据,库函数置高RTS和DTR。如果输入队列90%满,库函数置低RTS,但使DTR维持高电平。如果端口队列近乎空了,库函数置高RTS,但使DRT维持高电平。如果端口关闭,库函数置低RTS和DTR。

    3、XModem握手

    最后讨论的握手叫做XModem文件传输协议。这个协议在Modem通信中非常通用。尽管它通常使用在Modem通信中,XModem协议能够直接在其他遵循这个协议的设备通信中使用。在LabWindows中,实际的XModem应用对用户隐藏了。只要PC和其他设备使用XModem协议,在文件传输中就使用LabWindows的XModem函数。函数是XModemConfig,XModemSend和XModemReceive。

    1b3564e497333fc50370df8fac09e2bb.png

    XModem使用介于如下参数的协议:start_of_data、end_of_data、neg_ack、wait_delay、 start_delay、max_tries、packet_size。这些参数需要通信双方认定,标准的XModem有一个标准的定义:然而,可以通过 XModemConfig函数修改,以满足具体需要。这些参数的使用方法由接收方发送的字符neg_ack确定。这通知发送方其准备接收数据。它开始尝试发送,有一个超时参数start_delay;当超时的尝试超过max_ties次数,或者收到接收方发送的start_of_data,发送方停止尝试。如果从发送方收到start_of_data,接收方将读取后继信息数据包。包中含有包的数目、包数目的补码作为错误校验、packet_size字节大小的实际数据包,和进一步错误检查的求和校验值。在读取数据后,接收方会调用wait_delay,然后想发送方发送响应。如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次数的最大值max_tries。如果一直没有收到响应,发送方通知用户传输数据失败。

    由于数据必须以pack_size个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个数据包,后面会填充ASCII码NULL(0)字节。这导致接收的数据比原数据多。在XModem情况下一定不要使用XON/XOFF,因为XModem发送方发出包的数目很可能增加到XON/OFF控制字符的值,从而导致通信故障。

    来源/工控资料窝

    往期精彩▼

    工控原创投稿征集

    【有奖征集活动】工控人在旅途!

    走进“工业4.0未来工厂”,看看数字说什么!

    SMART 200也能做标准化编程~

    这份国家电网课件必须收好!配电系统、网架结构、线路设备……讲得太清晰了

    详解8大类18种液压阀,附38张动图,这波操作果真有料!

    3D动画演示:发动机冷却系统是如何工作的?

    如何理解步进电机的失步和过冲?

    西门子1200 、200smart、 LOGO! 实现S7通讯演示功能

    干货|电气控制柜二次回路布线工艺,很实用!

    组态王和施耐德M218实现Modbus TCP以太网通信

    【分享】谈PLC与PLC通讯

    满满的喜欢溢了出来,点在看

    e49ccfc47d51ee8e82a036502603da7f.gif
    展开全文
    weixin_39644146 2020-11-20 08:59:46
  • 本文将给出25个iptables常用规则示例,这些例子为您提供了些基本的模板,您可以根据特定需求对其进行修改调整以达到期望。 格式 iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数 -P 设置默认策略...

    本文将给出25个iptables常用规则示例,这些例子为您提供了些基本的模板,您可以根据特定需求对其进行修改调整以达到期望。  格式

     

    iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数

     

     

    1. -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
    2. -F 清空规则链
    3. -L 查看规则链
    4. -A 在规则链的末尾加入新规则
    5. -I num 在规则链的头部加入新规则
    6. -D num 删除某一条规则
    7. -s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
    8. -d 匹配目标地址
    9. -i 网卡名称 匹配从这块网卡流入的数据
    10. -o 网卡名称 匹配从这块网卡流出的数据
    11. -p 匹配协议,如tcp,udp,icmp
    12. --dport num 匹配目标端口号
    13. --sport num 匹配来源端口号

    示例

     

    1. 删除已有规则

     

    在开始创建iptables规则之前,你也许需要删除已有规则。

     

     

    1. 命令如下:
    2. iptables -F
    3. (or)
    4. iptables –flush

    2.设置链的默认策略

     

    链的默认政策设置为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:

     

     

    1. iptables -P INPUT DROP
    2. iptables -P FORWARD DROP
    3. iptables -P OUTPUT DROP

    当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。

     

    3. 阻止指定IP地址

     

    例:丢弃来自IP地址x.x.x.x的包

     

     

    1. iptables -A INPUT -s x.x.x.x -j DROP
    2. 注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析

    例:阻止来自IP地址x.x.x.x eth0 tcp的包

     

     

    1. iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
    2. iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP

    4. 允许所有SSH的连接请求

     

    例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    5. 仅允许来自指定网络的SSH连接请求

     

    例:仅允许来自于192.168.100.0/24域的用户的ssh连接请求

     

     

    1. iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    6.允许http和https的连接请求

     

    例:允许所有来自web - http的连接请求

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

    例:允许所有来自web - https的连接请求

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    7. 使用multiport 将多个规则结合在一起

     

    允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:  例:允许所有ssh,http,https的流量访问

     

     

    1. iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

    8. 允许从本地发起的SSH

     

     

    1. iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。

     

    9. 仅允许从本地发起到一个指定的网络域的SSH请求

     

    例:仅允许从内部连接到网域192.168.100.0/24

     

     

    1. iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    10. 允许从本地发起的HTTPS连接请求

     

    下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用wget从外部下载一些文件

     

     

    1. iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    注:对于HTTP web流量的外联请求,只需要将上述命令中的端口从443改成80即可。

     

    11. 负载平衡传入的网络流量

     

    使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。  例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。

     

     

    1. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
    2. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
    3. iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

    12. 允许外部主机ping内部主机

     

     

    1. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    2. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

    13. 允许内部主机ping外部主机

     

     

    1. iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    2. iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    14. 允许回环访问

     

    例:在服务器上允许127.0.0.1回环访问。

     

     

    1. iptables -A INPUT -i lo -j ACCEPT
    2. iptables -A OUTPUT -o lo -j ACCEPT

    15. 允许内部网络域外部网络的通信

     

    防火墙服务器上的其中一个网卡连接到外部,另一个网卡连接到内部服务器,使用以下规则允许内部网络与外部网络的通信。此例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。

     

     

    1. iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

    16. 允许出站的DNS连接

     

     

    1. iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
    2. iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

    17. 允许NIS连接

     

    如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。  rpcinfo -p | grep ypbind  例:允许来自111端口以及ypbind使用端口的连接请求

     

     

    1. iptables -A INPUT -p tcp --dport 111 -j ACCEPT
    2. iptables -A INPUT -p udp --dport 111 -j ACCEPT
    3. iptables -A INPUT -p tcp --dport 853 -j ACCEPT
    4. iptables -A INPUT -p udp --dport 853 -j ACCEPT
    5. iptables -A INPUT -p tcp --dport 850 -j ACCEPT
    6. iptables -A INPUT -p udp --dport 850 -j ACCEPT

    注:当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP 2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。

     

    18. 允许来自指定网络的rsync连接请求

     

    例:允许来自网络192.168.101.0/24的rsync连接请求

     

     

    1. iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

    19. 允许来自指定网络的MySQL连接请求

     

    很多情况下,MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:

     

     

    1. iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

    20. 允许Sendmail, Postfix邮件服务

     

    Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

    21. 允许IMAP和IMAPS

     

    例:允许IMAP/IMAP2流量,端口为143

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

    例:允许IMAPS流量,端口为993

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

    22. 允许POP3和POP3S

     

    例:允许POP3访问

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

    例:允许POP3S访问

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

    23. 防止DoS攻击

     

     

    1. iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
    2. 上述例子中:
    3. -m limit: 启用limit扩展
    4. –limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
    5. –limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。

    24. 端口转发

     

    例:将来自422端口的流量全部转到22端口。  这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

     

     

    1. iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

    除此之外,还需要允许连接到422端口的请求

     

     

    1. iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
    2. iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

    25. 记录丢弃的数据表

     

    第一步:新建名为LOGGING的链

     

     

    1. iptables -N LOGGING

    第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中

     

     

    1. iptables -A INPUT -j LOGGING

    第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”

     

     

    1. iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

    第四步:丢弃这些数据包

     

     

    1. iptables -A LOGGING -j DROP

     

     

    防火墙 导入导出 

    iptables-save  导出防火墙规则 

    iptables-save >>/iptables.txt

    iptables-restore 导入防火墙规则

    iptables-restore iptables.txt

    展开全文
    weixin_42123737 2018-06-01 21:09:29
  • float头文件定义了浮点型数值的最大最小限 浮点型数值以下面的方式定义:符号-value E 指数 符号是正负,value是数字的值 下面的值是用#define定义的,这些值是详细的实现,但是可能没有比这里给出的更详细, 在所有...

    C语言标准头

    <assert.h> 断言
    <ctype.h> 字符类测试 
    <errno.h> (部分)库函数抛出的错误代码 
    <float.h> 浮点数运算 
    <limits.h> 检测整型数据类型值范围 
    <locale.h> 本土化 
    <math.h> 数学函数 
    <setjmp.h> “非局部跳转” 
    <signal.h> 信号 
    <stdarg.h> 可变参数列表 
    <stddef.h> 一些常数,类型和变量 
    <stdio.h> 输入和输出 
    <stdlib.h> 实用功能 
    <string.h> 字符串函数 
    <time.h> 时间和日期函数

    <math.h> 数学函数

    <math.h> 是C语言中的数学函数库
    三角函数
    double sin(double x); 正弦
    double cos(double x); 余弦
    double tan(double x); 正切
    *cot三角函数,可以使用tan(PI/2-x)来实现。
    
    反三角函数
    double asin(double x);结果介于[-PI/2, PI/2]
    double acos(double x); 结果介于[0, PI]
    double atan(double x);
    反正切(主值), 结果介于[-PI/2, PI/2]
    double atan2(double y,double);
    反正切(整圆值), 结果介于[-PI, PI]
    
    双曲三角函数
    double sinh(double x); 计算双曲正弦
    double cosh(double x); 计算双曲余弦
    double tanh(double x); 计算双曲正切
    
    指数与对数
    double exp(double x); 求取自然数e的幂
    double sqrt(double x); 开平方
    double log(double x); 以e为底的对数
    double log10(double x); 以10为底的对数
    double pow(double x, double y);
    计算以x为底数的y次幂
    float powf(float x, float y);
    与pow一致,输入与输出皆为浮点数
    
    取整
    double ceil(double); 取上整
    double floor(double); 取下整
    
    标准化浮点数
    double frexp(double f, int *p);
    标准化浮点数, f = x * 2^p, 已知f求x, p ( x介于[0.5, 1] )
    double ldexp(double x, int p);
    与frexp相反, 已知x, p求f
    
    取整与取余
    double modf(double, double*);
    将参数的整数部分通过指针回传, 返回小数部分
    
    double fmod(double, double);
    返回两参数相除的余数 

    <stdio.h> 输入和输出

     

    <stdio.h>头文件定义了用于输入和输出的函数、类型和宏。最重要的类型是用于声明文件指针的FILE。另外两个常用的类型是 size_t和fpos_t,
    size_t是由运算符sizeof产生的无符号整类型;fpos_t类型定义能够唯一说明文件中的每个位置的对象。由头部 定义的最有用的宏是EOF,其值代表文件的结尾。
    
    变量:
    typedef size_t
    typedef FILE
    typedef fpos_t
    
    常量 :
    NULL 空值
    _IOFBF 表示完全缓冲
    _IOLBF 表示线缓冲
    _IONBF 表示无缓存
    BUFSIZ setbuf函数所使用的缓冲区的大小
    EOF EOF是负整数表示END OF FILE
    FOPEN_MAX (20)同时打开的文件的最大数量
    FILENAME_MAX 文件名的最大长度
    L_tmpnam整数,最大长度的临时文件名
    SEEK_CUR取得目前文件位置
    SEEK_END将读写位置移到文件尾时
    SEEK_SET将读写位置移到文件开头
    TMP_MAXtmpnam最多次数
    stderr标准错误流,默认为屏幕, 可输出到文件。
    stdin标准输入流,默认为键盘
    stdout标准输出流,默认为屏幕
    
    所有函数(点击可查看介绍和DEMO) :
    
    clearerr(); 复位错误标志
    fclose(); 关闭一个流。
    feof(); 检测文件结束符
    ferror(); 检查流是否有错误
    fflush();更新缓冲区
    fgetpos(); 移动文件流的读写位置
    fopen();打开文件
    fread(); 从文件流读取数据
    freopen(); 打开文件
    fseek(); 移动文件流的读写位置
    fsetpos();定位流上的文件指针
    ftell(); 取得文件流的读取位置
    fwrite(); 将数据写至文件流
    remove(); 删除文件
    rename(); 更改文件名称或位置
    rewind(); 重设读取目录的位置为开头位置
    setbuf(); 把缓冲区与流相联
    setvbuf(); 把缓冲区与流相关
    tmpfile(); 以wb+形式创建一个临时二进制文件
    tmpnam();  产生一个唯一的文件名
    fprintf(); 格式化输出数据至文件
    fscanf(); 格式化字符串输入
    printf(); 格式化输出数据
    scanf(); 格式输入函数
    sprintf(); 格式化字符串复制
    sscanf(); 格式化字符串输入
    vfprintf(); 格式化输出数据至文件
    vprintf(); 格式化输出数据
    vsprintf(); 格式化字符串复制
    fgetc(); 由文件中读取一个字符
    fgets(); 文件中读取一字符串
    fputc(); 将一指定字符写入文件流中
    fputs(); 将一指定的字符串写入文件内
    getc(); 由文件中读取一个字符
    getchar(); 由标准输入设备内读进一字符
    gets(); 由标准输入设备内读进一字符串
    putc(); 将一指定字符写入文件中
    putchar(); 将指定的字符写到标准输出设备
    puts(); 送一字符串到流stdout中
    ungetc();  将指定字符写回文件流中
    perror(); 打印出错误原因信息字符串 

    <assert.h> 断言

    头文件<assert.h>唯一的目的是提供宏assert的定义。如果断言非真(expression==0),则程序会在标准错误流输出提示信息,
    并使程序异常中止调用abort() 。
    定义:void assert (int expression);
    
    //#define NDEBUG
    #include <assert.h>	
    int main(int argc, char* argv[]){
    	int a = 12;
    	int b = 24;
    	assert( a > b );
    	printf("a is larger than b!");
    	return 0;
    }
    
    上面的程序会发现程序中止,printf并未执行,且有这样的输出: main: Assertion `a > b' failed. 原因就是因为a其实小于b,
    导致断言失败,assert 输出错误信息,并调用abort()中止了程序执行。 

    <ctype.h> 字符测试

    <ctype.h> 主要提供两类重要的函数:字符测试函数和字符大小转化函数。提供的函数中都以int类型为参数,并返回一个int类型的值。实参类型应该隐式转换或者显示转换为int类型。
    int isalnum(int c); 判断是否是字母或数字。
    int isalpha(int c); 判断是否是字母。
    int iscntrl(int c); 判断是否是控制字符。
    int isdigit(int c); 判断是否是数字。
    int isgraph(int c); 判断是否是可显示字符。
    int islower(int c); 判断是否是小写字母。
    int isupper(int c); 判断是否是大写字母。
    int isprint(int c); 判断是否是可显示字符。
    int ispunct(int c); 判断是否是标点字符。
    int isspace(int c); 判断是否是空白字符
    int isxdigit(int c); 判断字符是否为16进制。
    int tolower(int c); 转换为小写字母。
    int toupper(int c); 转换为大写字母

    <errno.h> 错误代码

    error.h 是 C语言 C标准函式库里的头文件,定义了通过错误码来返回错误信息的宏:
    
    errno 宏定义为一个int型态的左值, 包含任何函数使用errno功能所产生的上一个错误码。
    
    一些表示错误码,定义为整数值的宏:
    EDOM 源自于函数的参数超出范围,例如 sqrt(-1)
    ERANGE 源自于函数的结果超出范围,例如s trtol("0xfffffffff",NULL,0)
    EILSEQ 源自于不合​​法的字符顺序,例如 wcstombs(str, L"\xffff", 2)

    <float.h> 浮点数运算

    float头文件定义了浮点型数值的最大最小限 浮点型数值以下面的方式定义:符号-value E 指数 符号是正负,value是数字的值
    下面的值是用#define定义的,这些值是详细的实现,但是可能没有比这里给出的更详细,
    在所有实例里FLT指的是float,DBL是double,LDBL指的是long double
    FLT_ROUNDS
    定义浮点型数值四舍五入的方式,-1是不确定,0是向0,1是向最近,2是向正无穷大,3是负无穷大
    FLT_RADIX 2
    定义指数的基本表示(比如base-2是二进制,base-10是十进制表示法,16是十六进制)
    FLT_MANT_DIG,DBL_MANT_DIG,LDBL_MANT_DIG
    定义数值里数字的个数
    FLT_DIG 6,DBL_DIG 10,LDBL_DIG 10
    在四舍五入之后能不更改表示的最大小数位
    FLT_MIN_EXP,DBL_MIN_EXP,LDBL_MIN_EXP
    FLT_RADIX 的指数的最小负整数值
    FLT_MIN_10_EXP -37,DBL_MIN_10_EXP -37,LDBL_MIN_10_EXP -37
    10进制表示法的的指数的最小负整数值
    FLT_MAX_EXP ,DBL_MAX_EXP ,LDBL_MAX_EXP
    FLT_RADIX 的指数的最大整数值
    FLT_MAX_10_EXP +37 ,DBL_MAX_10_EXP ,LDBL_MAX_10_EXP +37 +37
    10进制表示法的的指数的最大整数值
    FLT_MAX 1E+37,DBL_MAX 1E+37,LDBL_MAX 1E+37
    浮点型的最大限
    FLT_EPSILON 1E-5,DBL_EPSILON 1E-9,LDBL_EPSILON 1E-9
    能表示的最小有符号数

    <setjmp.h> “非局部跳转

     

    在该头文件中定义了一种特别的函数调用和函数返回顺序的方式。这种方式不同于以往的函数调用和返回顺序,
    它允许程序流程立即从一个深层嵌套的函数中返回。
    <setjmp.h> 中定义了两个宏:
    
    int setjmp(jmp_buf env); /*设置调转点*/
    longjmp(jmp_buf jmpb, int retval); /*跳转*/
    
    宏setjmp的功能是将当前程序的状态保存在结构env ,为调用宏longjmp设置一个跳转点。setjmp将当前信息保存在env中供longjmp使用。其中env是jmp_buf结构类型的。
    Demo :
    
    #include  <stdio.h>
    #include  <setjmp.h>
    static jmp_buf buf;
    void second(void) {
        printf("second\n");        
    	// 打印
        longjmp(buf,1);            
    	// 跳回setjmp的调用处
    	- 使得setjmp返回值为1
    }
     void first(void) {
        second();
        printf("first\n");          
    	// 不可能执行到此行
    }
     int main() {   
        if ( ! setjmp(buf) ) {
            first();               
    	// 进入此行前,setjmp返回0
        } else {                  
    	// 当longjmp跳转回,
    	setjmp返回1,因此进入此行
            printf("main\n");  
    		// 打印
        }
         return 0;
    }
    
    直接调用setjmp时,返回值为0,这一般用于初始化(设置跳转点时)。以后再调用longjmp宏时用env变量进行跳转。程序会自动跳转到setjmp宏的返回语句处,此时setjmp的返回值为非0,由longjmp的第二个参数指定。
    一般地,宏setjmp和longjmp是成对使用的,这样程序流程可以从一个深层嵌套的函数中返回。 

    <stdlib.h> 实用功能

     

    <stdlib.h> 头文件里包含了C语言的中最常用的系统函数
    
    宏:
    
        NULL 空
        EXIT_FAILURE 失败状态码
        EXIT_SUCCESS 成功状态码
        RAND_MAX rand的最大返回值
        MB_CUR_MAX 多字节字符中的最大字节数
    
    变量:
    
        typedef size_t是unsigned integer类型
        typedef wchar_t 一个宽字符的大小
        struct div_t 是结构体类型 作为div函数的返回类型
        struct ldiv_t是结构体类型 作为ldiv函数的返回类型
    
    函数:
    
        字符串函数
        atof(); 将字符串转换成浮点型数
        atoi(); 将字符串转换成整型数
        atol(); 将字符串转换成长整型数
        strtod(); 将字符串转换成浮点数
        strtol(); 将字符串转换成长整型数
        strtoul(); 将字符串转换成无符号长整型数
    
        内存控制函数
        calloc(); 配置内存空间
        free(); 释放原先配置的内存
        malloc(); 配置内存空间
        realloc(); 重新分配主存
    
        环境函数
        abort(); 异常终止一个进程
        atexit();设置程序正常结束前调用的函数
        exit(); 正常结束进程
        getenv(); 取得环境变量内容
        system(); 执行shell 命令
    
        搜索和排序函数
        bsearch(); 二元搜索
        qsort(); 利用快速排序法排列数组
    
        数学函数
        abs(); 计算整型数的绝对值
        div(); 将两个整数相除, 返回商和余数
        labs(); 取长整型绝对值
        ldiv();两个长整型数相除, 返回商和余数
        rand(); 随机数发生器
        srand(); 设置随机数种子
    
        多字节函数
        mblen(); 根据locale的设置确定字符的字节数
        mbstowcs(); 把多字节字符串转换为宽字符串
        mbtowc(); 把多字节字符转换为宽字符
        wcstombs(); 把宽字符串转换为多字节字符串
        wctomb(); 把宽字符转换为多字节字符
    
    

    <signal.h> 信号

    在signal.h头文件中,提供了一些函数用以处理执行过程中所产生的信号。
    宏:
    SIG_DFL
    SIG_ERR
    SIG_IGN
    SIGABRT
    SIGFPE
    SIGILL
    SIGINT
    SIGSEGV
    SIGTERM
    函数:
    signal();
    raise();
    变量:
    typedef sig_atomic_t
    sig_atomic_t 类型是int类型,用于接收signal函数的返回值。
    以SIG_开头的宏用于定义信号处理函数
    SIG_DFL 默认信号处理函数。
    SIG_ERR	表示一个错误信号,当signal函数调用失败时的返回值。
    SIG_IGN	信号处理函数,表示忽略该信号。
    SIG开头的宏是用来在下列情况下,用来表示一个信号代码:
    SIGABRT	异常终止(abort函数产生)。
    SIGFPE	浮点错误(0作为除数产生的错误,非法的操作)。
    SIGILL	非法操作(指令)。
    SIGINT	交互式操作产生的信号(如CTRL - C)。
    SIGSEGV	无效访问存储(片段的非法访问,内存非法访问)。
    SIGTERM	终止请求。
    signal 函数
    void(*signal(int sig,void (*func)(int)))(int);
    上面的函数定义中,sig 表示一个信号代码(相当于暗号类别),即是上面所定义的SIG开头的宏。当有信号出现(即当收到暗号)的时候,参数func所定义的函数就会被调用。如果func等于SIG_DFL,则表示调用默认的处理函数。如果等于SIG_IGN,则表示这个信号被忽略(不做处理)。如果func是用户自定义的函数,则会先调用默认的处理函数,再调用用户自己定义的函数。 自定义函数,有一个参数,参数类型为int,用来表示信号代码(暗号类别)。同时,函数必须以return、abort、exit 或 longjump等语句结束。当自定义函数运行结束,程序会继续从被终止的地方继续运行。(除非信号是SIGFPE导致结果未定义,则可能无法继续运行)
    如果调用signal函数成功,则会返回一个指针,该指针指向为所指定的信号类别的所预先定义的信号处理器。
    如果调用失败,则会返回一个SIG_ERR,同时errno的值也会被相应的改变。
    raise 函数
    int raise(int sig);
    发出一个信号sig。信号参数为SIG开头的宏。
    如果调用成功,返回0。否则返回一个非零值。

    <limits.h> 取值范围

    CHAR_BIT 一个ASCII字符长度
    SCHAR_MIN 字符型最小值
    SCHAR_MAX 字符型最大值
    UCHAR_MAX 无符号字符型最大值
    CHAR_MIN
    CHAR_MAX
    char字符的最大最小值,如果char字符正被表示有符号整数。它们的值就跟有符号整数一样。 否则char字符的最小值就是0,最大值就是无符号char字符的最大值。
    MB_LEN_MAX 一个字符所占最大字节数
    SHRT_MIN 最小短整型
    SHRT_MAX 最大短整形
    USHRT_MAX 最大无符号短整型
    INT_MIN 最小整型
    INT_MAX 最大整形
    UINT_MAX 最大无符号整型
    LONG_MIN 最小长整型
    LONG_MAX 最大长整型
    ULONG_MAX 无符号长整型
    

    <locale.h> 本土化

     

    国家、文化和语言规则集称为区域设置,<locale.h> 头文件中定义了区域设置相关的函数。setlocale函数用于设置或返回当前的区域特性,localeconv用于返回当前区域中的数字和货币信息(保存在struct lconv结构实例中)。setlocale的第一个实参指定要改变的区域行为类别,预定义的setlocale类别有:
    LC_ALL
    全部本地化信息
    LC_COLLATE
    影响strcoll和strxfrm
    LC_CTYPE
    影响字符处理函数和多行字符处理函数
    LC_MONETARY
    影响localeconv返回的货币格式化信息
    LC_NUMERIC
    影响格式化输入输出字符中的小数点符号
    LC_TIME
    影响strftime函数
    <locale.h> 头文件中提供了2个函数
    setlocale() 设置或恢复本地化信息
    localeconv() 返回当前地域设置的信息
    setlocale(constant,location) 用法
    如果这个函数成功执行,将返回当前的场景属性;如果执行失败,将返回False。
    constant 参数 (必要参数。指定设置的场景信息)
    LC_ALL – 所有下属的常量
    LC_COLLATE – 排列顺序
    LC_CTYPE – 字符分类和转换(例如:将所有的字符转换成小写或大写形式)
    LC_MESSAGES – 系统信息格式
    LC_MONETARY – 货币 / 通货格式
    LC_NUMERIC – 数值格式
    LC_TIME – 日期和时间格式
    location (必要参数)
    必要参数。指定需要进行场景信息设置的国家或区域。它可以由一个字符串或一个数组组成。如果本地区域是一个数组,那么setlocale()函数将尝试每 个数组元素直到它从中获取有效的语言和区域代码信息为止。如果一个区域处于不同操作系统中的不同名称下,那么这个参数将非常有用。
    struct lconv *localeconv(void); 用法
    localeconv 返回lconv结构指针 lconv结构介绍: 保存格式化的数值信息,保存数值包括货币和非货币的格式化信息,localeconv返回指向该对象的指针,以下为结构中的成员及信息:
    char *decimal_point; 数字的小数点号
    char *thousands_sep; 数字的千分组分隔符
    每个元素为相应组中的数字位数,索引越高的元素越靠左边。一个值为CHAR_MAX的元素表示没有更多的分组了。一个值为0的元素表示前面的元素能用在靠左边的所有分组中
    char *grouping; 数字分组分隔符
    char *int_curr_symbol; 前面的三个字符ISO 4217中规定的货币符号,第四个字符是分隔符,第五个字符是'\0' */
    char *currency_symbol; 本地货币符号
    char *mon_decimal_point; 货币的小数点号
    char *mon_thousands_sep; 千分组分隔符
    char *mon_grouping; 类似于grouping元素
    char *positive_sign; 正币值的符号
    char *negative_sign; 负币值的符号
    char int_frac_digits; 国际币值的小数部分
    char frac_digits; 本地币值的小数部分
    char p_cs_precedes; 如果currency_symbol放在正币值之前则为1,否则为0
    char p_sep_by_space; 当且仅当currency_symbol与正币值之间用空格分开时为1
    char n_cs_precedes; < 如果currency_symbol放在负币值之前则为1,否则为0/dt>
    char n_sep_by_space; 当且仅当currency_symbol与负币值之间用空格分开时为1
    char p_sign_posn; 格式化选项
    0 - 在数量和货币符号周围的圆括号
    1 - 数量和货币符号之前的 + 号
    2 - 数量和货币符号之后的 + 号
    3 - 货币符号之前的 + 号
    4 - 货币符号之后的 + 号
    char n_sign_posn 格式化选项
    0 - 在数量和货币符号周围的圆括号
    1 - 数量和货币符号之前的 - 号
    2 - 数量和货币符号之后的 - 号
    3 - 货币符号之前的 - 号
    4 - 货币符号之后的 - 号
    最后提示:可以使用setlocale(LC_ALL,NULL)函数将场景信息设置为系统默认值。

    <stdarg.h> 可变参数

    <stdarg.h> 头文件定义了一些宏,当函数参数未知时去获取函数的参数
    变量:typedef va_list
    
    宏:
    
        va_start()
        va_arg()
        va_end()
    
    
    变量和定义
    va_list类型通过stdarg宏定义来访问一个函数的参数表,参数列表的末尾会用省略号省略
    
    声明:void va_start(va_list ap, last_arg);
    用va_arg和va_end宏初始化参数ap,last_arg是传给函数的固定参数的最后一个,省略号之前的那个参数 注意va_start必须在使用va_arg和va_end之前调用
    
    声明:type va_arg(va_list ap, type);
    用type类型扩展到参数表的下个参数
    注意ap必须用va_start初始化,如果没有下一个参数,结果会是undefined
    
    声明:void va_end(va_list ap); 允许一个有参数表(使用va_start宏)的函数返回,如果返回之前没有调用va_end,结果会是undefined。参数变量列表可能不再使用(在没调用va_start的情况下调用va_end)
    

    <stddef.h> 一些常数,类型和变量

    <stddef.h> 头文件定义了一些标准定义,许多定义也会出现在其他的头文件里
    宏命令:NULL 和 offsetof()
    
    变量:
    typedef ptrdiff_t
    typedef size_t
    typedef wchar_t
    
    变量和定义:
    ptrdiff_t是两个指针相减的结果
    size_t是sizeof一个关键词得到的无符号整数值
    wchar_t是一个宽字符常量的大小,是整数类型
    NULL是空指针的常量值
    
    offsetof(type, member-designator);这个宏返回一个结构体成员相对于结构体起始地址的偏移量(字节为单位),type是结构体的名字,member-designator是结构体成员的名字。
    

    <string.h> 字符串函数

    <stdlib.h> 头文件里包含了C语言的最常用的字符串操作函数
    
    宏:
    
        NULL 空
    
    变量:
    
        typedef size_t
    
    函数:
    
        memchr();在某一内存范围中查找一特定字符
        memcmp(); 比较内存内容
        memcpy(); 拷贝内存内容
        memmove(); 拷贝内存内容
        memset(); 将一段内存空间填入某值
        strcat(); 连接两字符串
        strncat(); 连接两字符串
        strchr(); 查找字符串中第一个出现的指定字符
        strcmp(); 比较字符串
        strncmp();比较2个字符串的前N个字符
        strcoll(); 采用目前区域的字符排列比较字符串
        strcpy(); 拷贝字符串
        strncpy(); 拷贝字符串
        strcspn(); 返回字符连续不含指定字符的字符数
        strerror(); 返回错误原因的描述字符串
        strlen(); 计算字符串长度
        strpbrk(); 查找字符串中第一个出现的指定字符
        strrchr(); 查找字符串中最后出现的指定字符
        strspn();返回字符串连续不含指定字符的字符数
        strstr(); 在一字符串中查找指定的字符串
        strtok(); 分割字符串
        strxfrm(); 转换字符串
    
    

    <time.h> 时间和日期函数

    <time.h> 是C标准函数库中获取时间与日期、对时间与日期数据操作及格式化的头文件。
    
    宏:
    
        NULL null是一个null指针常量的值
        CLOCKS_PER_SEC 每秒的时钟数
    
    变量:
    
        typedef size_t 类型定义
        typedef clock_t类型定义
        struct tm 结构体
    
        struct tm {
        int tm_sec; /* 秒 – 取值区间为[0,59] */
    
        int tm_min; /* 分 - 取值区间为[0,59] */
    
        int tm_hour; /* 时 - 取值区间为[0,23] */
    
        int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
    
        int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
    
        int tm_year; /* 年份,其值等于实际年份减去1900 */
    
        int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
    
        int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
    
        int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
        };
    
    函数:
    
        asctime(); 将时间和日期以字符串格式表示
        clock(); 确定处理器时间
        ctime(); 把日期和时间转换为字符串
        difftime(); 计算两个时刻之间的时间差
        gmtime(); 把日期和时间转换为(GMT)时间
        localtime();取得当地目前时间和日期
        mktime();将时间结构数据转换成经过的秒数
        strftime(); 将时间格式化
        time(); 取得目前的时间
    
    

     

     

     

     

     

    展开全文
    qq_35782149 2018-07-18 03:27:10
  • he90227 2016-05-30 13:43:38
  • loner_fang 2018-08-28 17:27:22
  • xiaofei125145 2016-07-08 11:57:12
  • weixin_33937913 2018-11-21 02:01:36
  • hubaichun 2018-11-21 15:32:36
  • weixin_43917654 2019-03-11 11:24:00
  • u013628152 2014-12-26 17:47:51
  • my_learning_road 2018-03-30 17:16:36
  • dgreh 2018-09-02 16:10:01
  • weixin_48722971 2020-12-19 23:46:21
  • xiang__liu 2018-09-19 12:06:38
  • manmanwei 2016-08-31 16:06:17
  • wangjiaweiwei 2019-04-10 14:11:31
  • smilejiasmile 2018-11-22 13:37:31
  • qq_35190492 2020-11-10 18:29:46
  • sinat_27933301 2018-05-19 00:29:17
  • u011002547 2017-09-04 14:20:28
  • huilan_same 2017-01-12 15:59:06
  • sinat_36458870 2017-04-14 15:13:21
  • u012373815 2016-12-25 21:29:51
  • xuhui_liu 2017-05-25 14:26:00
  • u010780612 2018-04-30 17:24:55
  • claram 2019-08-05 17:44:14
  • fly910905 2019-02-11 19:57:19
  • csdn_of_coder 2016-08-13 17:22:49
  • banjing_1993 2018-07-03 13:57:55

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,375
精华内容 63,350
关键字:

常用接口参数定义规则