精华内容
下载资源
问答
  • 关于socket的SO_LINGER选项的用法

    千次阅读 2011-01-19 11:11:00
    关于SO_LINGER使用说明SO_LINGER 此选项指定函数close对面向连接协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。SO_LINGER选项用来改变此...
    关于SO_LINGER的使用说明

    SO_LINGER

       此选项指定函数close对面向连接的协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。

     

    SO_LINGER选项用来改变此缺省设置。使用如下结构:

    struct linger {

         int l_onoff; /* 0 = off, nozero = on */

         int l_linger; /* linger time */

    };

     

    有下列三种情况:

    l_onoff0,则该选项关闭,l_linger的值被忽略,等于缺省情况,close立即返回;

    l_onoff为非0l_linger0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;

    l_onoff 为非0l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失close的成功返回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完 成。

     

    l_linger的单位依赖于实现,4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix.1g规定单位为秒。

    展开全文
  • 关于typedef的用法

    2018-01-14 16:25:00
    参考:...  https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204 typedef在简单别名用法中经常用来和#define比较。 以下参考《C语言内核解析》3.9.5小节及4.6节:...

    参考:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html

       https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

    typedef在简单的别名用法中经常用来和#define比较。

    以下参考《C语言内核解析》3.9.5小节及4.6节

    #define与typedef都可以用来给现有类型起别名。#define只是简单宏替换,在预编译时被处理。typedef不是简单替换,它具有语义分析,是一种存储类的关键字,用来为复杂的声明定义简单的别名。

     

    简单应用中的区别

    #define和typedef写法的区别在于:#define原型在后,别名在前  typedef原型在前,别名在后

    区别一:#define简单替换,typedef不是

    #define dpchar char *;

    typedef char * tpchar;

    dpchar p1,p2;    //只是简单的替换,等价于 char *p1,p2;只有p1才是指针变量

    tpchar p1,p2;    //不是简单的替换,等价于 char *p1,p2;p1,p2都是指针变量

    区别二:#define可实现类型组合,typedef不行

    #define dint int;

    typedef int tint;

     

    unsigned dint p1,p2;  //正确,等价于unsigned int p1,p2

    unsigned tint p1,p2;  //不可以

    区别三:typedef可以组建新类型,但是#define不行

    typedef char[200] charBuf;

    charBuf buf;      //等价于char buf[200],但是#define不行

     

    typedef的复杂用法

    数据结构组合

    typedef char Line[81]  Line类型代表具有81个元素的字符数组。Line t 就等同于char t[81]。参考https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

    函数指针

    typedef  int  (*fun_ptr)(int,int);  //typedef行

    int     (*fp)(int,int);        //原型行

    fun_ptr   fp;            //应用行

    “typedef行”和“原型行”相比,“typedef行”仅仅多个typedef,根本区别在于,fun_ptr是类的别名,fp是该类的变量。“原型行”和“应用行”的编译结果是一样的。他们都是创建了一个类型为int(*)(int,int)的函数指针fp。只是应用行比原型行这种形式更加简洁,便于书写和理解。

    形式越复杂,typedef的优势就越明显。

    typedef和struct

     typedef和struct组合是常见用法

    C语言中struct普通用法:struct node n;

    配合typedef:

    1、利用结构体类型申请变量时就可以省略掉struct这个关键字。

    typedef struct node  //给struct node{ }类型取别名

    {

    }Node;

    Node  n;     //利用结构体类型申请变量

    2、使用typedef一次定义两个类型,分别是结构体类型和结构体指针类型

    typedef struct node

    {

    } Node,*pNode;

    其中Node为结构体类型,pNode是结构体指针类型。

    typedef与const

    1、typedef int *PINT;

       const PINT p2;

    相当于是int *const p2;

    2、typedef int *PINT;

       PINT const p2;

    相当于是int *const p2;

    3、const int *p写成

      typedef const int *CPINT;

      CPINT p;

     

    使用typedef的两个重要意义:(1)简化类型,让程序更易理解和书写。 (2)创造平台无关类型,便于移植【写不同的平台时定义相同别名】

     

    转载于:https://www.cnblogs.com/tangtangde12580/p/8283588.html

    展开全文
  • ENGINE引擎并不会提供所有密码学变换,而是提供了一个大部分常用密码学封装替换功能,也就是说在ENGINE支持范围内,密码学功能是可以被动态替换,这个替换方式可以使用so库文件在运行时动态加载,并且...

    Engine是OpenSSL中用以封装不同的下层密码学引擎的核心框架。所有的引擎的创建都以ENGINE *engine = ENGINE_new(); 开始。ENGINE引擎并不会提供所有的密码学变换,而是提供了一个大部分常用的密码学的封装替换功能,也就是说在ENGINE支持的范围内,密码学的功能是可以被动态替换的,这个替换的方式可以使用so库文件在运行时动态加载,并且究竟加载哪一个ENGINE,是可以通过OpenSSL的配置文件来配置的。

    RSA_METHOD,DSA_METHOD, DH_METHOD, RAND_METHOD, ECDH_METHOD, ECDSA_METHOD:这些算法的替代实现

    EVP_CIPHER - 对称加密算法的替代实现

    EVP_DIGEST - 哈希算法的替代实现

    key-loading :私钥公钥证书等加载算法的替代实现

    ENGINE结构体生成了并不代表就存在了。因为Engine对应的是一个so库文件和其他的内置ENGINE。so文件在调用了ENGINE_new函数之后也并没有加载,而是在调用了ENGINE_init()才会去正式的加载对应的库文件。所以实际上创建的ENGINE只是一个结构体层面的ENGINE,ENGINE真的要生效还要等到使用ENGINE_add()函数实际的加载和装载进内部的结构体。OpenSSL的内部维护了一个ENGINE的链表,使用ENGINE_get_next() 可以遍历这个链表。

    即使不使用ENGINE引擎,整个OpenSSL也是可以正常工作的,只是使用的对应的算法都是软件实现的效率比较低的算法。通常一个引擎的出现都是为了提高效率。不同的引擎下面会挂载很多对不同的算法的不同的实现方法,这些方法都是通过OpenSSL的nid子系统进行区分。使用OpenSSL的一个很重要的一直要有理解的就是nid子系统。相当于OpenSSL的内部数据库。ENGINE子系统永远是给外部提供使用的,这一点很重要,因为虽然OpenSSL的内部理论上也是存在ENGINE,也是提供很多种实现,但是实际在编译的时候都是静态的编译进OpenSSL的,ENGINE引擎的接口只是提供给需要动态加载的外部so文件使用的。所以外部的硬件驱动开发者可以开发一个so文件的ENGINE,修改OpenSSL的配置就可以达到让OpenSSL使用自己开发的ENGINE的目的,从而完成卸载加密操作的需求。例如Intel的QAT硬件加速卡就是用的这种方式提供的OpenSSL的ENGINE驱动的。

    ENGINE引擎子系统对每一种密码学算法都有一些特定的默认实现,有一个初始化函数,在解析配置的时候触发,这个函数是ENGINE_load_builtin_engines。这个函数实际上调用的是OPENSSL_init_crypto(OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL); 就是加载了几乎所有的使用nid注册密码学算法。这样在程序使用的时候可以获得到的默认密码学算法就可以根据当前的CPU flag或者其他的条件进行选择了。

    以下是一个Intel QAT的代码片段。

    CpaInstanceHandle get_next_inst(void)

    {

    CpaInstanceHandle instance_handle = NULL;

    ENGINE* e = NULL;

    if (1 == enable_instance_for_thread) {

    instance_handle = pthread_getspecific(qatInstanceForThread);

    if (instance_handle == NULL) {

    WARN("No thread specific instance is available\n");

    return instance_handle;

    }

    }

    e = ENGINE_by_id(engine_qat_id);

    if(e == NULL) {

    WARN("Function ENGINE_by_id returned NULL\n");

    instance_handle = NULL;

    return instance_handle;

    }

    if(!qat_engine_init(e)){

    WARN("Failure in qat_engine_init function\n");

    instance_handle = NULL;

    ENGINE_free(e);

    return instance_handle;

    }

    ENGINE_free(e);

    if (instance_handle == NULL)

    {

    if (qat_instance_handles) {

    instance_handle = qat_instance_handles[curr_inst];

    incr_curr_inst();

    } else {

    WARN("No instances are available\n");

    instance_handle = NULL;

    }

    }

    return instance_handle;

    }

    可以看到在qat的驱动中是直接调用的ENGINE_by_id来获得QAT ENGINE的句柄。engine_qat_id的内容是一个字符串”qat”,显然的这个字符串会提前的配置到OpenSSL的配置文件中。当OpenSSL在解析配置文件的时候,就会解析到这个引擎的信息,然后会加载该引擎到OpenSSL的上下文。当调用到驱动的初始化函数的时候,这个ENGINE已经在OpenSSL中加载好了。这里开始对其进行QAT相关的初始化。qat_engine_init就是完成这件事情的。

    展开全文
  • 二是动态库文件,以.so为后缀文件。其二者主要区别在于静态库是在编译时加载,而动态库是在运行时加载。 关于静态库文件使用比较繁多,在makefile中使用如下例: LIBS = -L./ -L$(ROOTPATH)/lib/ \ -ltest ...

    linux下库文件有两种:一是静态库文件,以.a为后缀的文件。二是动态库文件,以.so为后缀的文件。其二者主要区别在于静态库是在编译时加载,而动态库是在运行时加载。

    关于静态库文件使用比较繁多,在makefile中的使用如下例:

    LIBS = -L./ -L$(ROOTPATH)/lib/ \
    -ltest

    这里加载的静态库文件是libtest.a。

    如果想要使用动态库中的接口函数,可以使用两种方法。

    方法1:

    extern "C" int testso1(param1,param2,...);


    int testso1(param1,param2,...)
    {
    code:
    return 0;
    }

    其他地方应用的时候需要利用

    #include <dlfcn.h>
    #include <stdio.h>
    typedef int (*fun)(char *,int);
    dp=dlopen("./libtestso.so",RTLD_LAZY);
    pFunction=(fun)dlsym(dp,"testso1");
    (*pFunction)(strCode,512);
    方法2:

    将需要的的接口函数放到一个头文件中声明,其他地方引用时只需包含磁头文件。makefile中需要写明.so文件的全称,及准确的路径。

    通过对两种文件的比较,个人认为,方法1在c调用c++的方法时效果明显。方法2在c++调用c++中其他组件方法时效果很好。方便易行!


    展开全文
  • 关于python re.sub用法

    2018-11-29 16:45:57
    text = “JGood is a handsome boy, he is cool, clever, and so on…” print(re.sub(r’\s+’, ‘-’, text)) JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on… print(re.sub(r’is\s+’, ‘-’, text)....
  • 关于LD_PRELOAD的用法

    2012-12-30 16:20:35
    转自: http://blog.linuxeden.com/index.php/196616/viewspace-8082.html $ make run LD_LIBRARY_PATH=./ LD_PRELOAD=libleak.so ./main malloc 0x893b008, size 1 free 0x893b008 $ cat main.c #include
  • 关于架包引入 请先参考官方文档, Android SDK 集成指南这里文档说是最新版架包在AndroidStudio中引入方法, 直接可以在build中使用compile引入,并进行相关配置。如果全部配置完成检查app中是否生成有.so...
  • 文章目录sort1. 这两个命令共同点2.sort3.下面展示一下 sort 现网实施案例uniq2....sort 1. 这两个命令共同点 都是对文本文件进行排序,经常在过滤日志时候会使用到 ...功能说明:将文本文件内容加以排序,so...
  • 1、redis 是什么 redis是一种支持Key-Value等多种数据结构存储系统。可用于缓存,事件发布或订阅,高速队列等...Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(so...
  • 正如之前看到的一篇文章,假设想要知道是谁登陆了你的数据库server,干了什么东西,...的用法:方法一:1、在你的MySQL安装文件夹里找到audit_log.so。我的是在/usr/lib/mysql/plugin/文件夹下。2、将plugin-load=...
  • 如下代码是关于python中字典用法大全代码。 #!/usr/bin/env python # # [SNIPPET_NAME: Dictionaries 101] # [SNIPPET_CATEGORIES: Python Core] # [SNIPPET_DESCRIPTION: Basic and not so basic dictionary ...
  • SELECT * FROM ( SELECT sg.opp_id, sg.sales_id,sg.old_sales_id,sg.id, Row_Number()over(PARTITION BY sg.opp_id ORDER BY sg.gmt_create desc) rwn,sg.gmt_createFROM nirvana.sfa_opportunity so, nirvana.sfa_...
  • 如下代码是关于python中字典用法大全代码。#!/usr/bin/env python## [SNIPPET_NAME: Dictionaries 101]# [SNIPPET_CATEGORIES: Python Core]# [SNIPPET_DESCRIPTION: Basic and not so basic dictionary ...
  • 标签:如下代码是关于python中字典用法大全代码。#!/usr/bin/env python## [SNIPPET_NAME: Dictionaries 101]# [SNIPPET_CATEGORIES: Python Core]# [SNIPPET_DESCRIPTION: Basic and not so basic dictionary ...
  • 如下代码是关于python中字典用法大全代码。#!/usr/bin/env python## [SNIPPET_NAME: Dictionaries 101]# [SNIPPET_CATEGORIES: Python Core]# [SNIPPET_DESCRIPTION: Basic and not so basic dictionary ...
  • 转载于 C和C++混合编译,extern”C”的用法 关于extern_C 通常,在C语言的头文件中经常可以看到类似下面这种形式的代码 #ifdef __cplusplus extern "C" { #endif /**** some declaration or so **...
  • 推荐murphy工具箱,这篇博客是根据大牛工具箱使用写一些note Kevin Murphy 现在在Google brain工作,...他写的关于机器学习工具箱非常好,规范,注释也多,可供大家学习 https://www.cs.ubc.ca/~murphyk/So...
  • A、refer to1,参考,查阅 2,谈到,提及3,涉及,关于 4,暗示,意指B、while用法1,用作连词(conj)“在···期间,当···时候”,while引导时间状语从句既可以可放在句首,也可反复在句末。Wh...
  • 现实生活中的用法 我使用此API从存储在Notion中的内容发布我的和一系列。 概念用作CMS(内容管理系统)。 我在Notion中编写和编辑页面。 我使用此库使用自定义的Go程序来下载概念页面,并将页面转换为HTML。 然后...
  • 因为需要树莓派进行人脸比对,所以安装了face_recognition这个库,这个库是个最简单人脸比对库,用起来非常方便,大家自行百度这个库用法 当我安装完库准备运行程序时候遇到了一个很大bug 给我报了一个莫名...
  • 在学习过程中,我们可能听过关于”线程安全“问题,就StringBuffer和StringBuilder而言,StringBuffer是线程安全,而StringBuilder不是,, ”敢问为何如此“,, 大多数回答都是: ”StringBuffer里对应...
  • 一、基本Socket 调用 ...注意关于windows.h 与 winsock2.h 一起使用时问题: The Winsock2.h header file internally includes core elements from theWindows.h header file, so there is not usua
  • 正如之前看到的一篇文章,假设想要知道是谁登陆了你的数据库server,干了什么东西,那么...的用法: 方法一: 1、在你的MySQL安装文件夹里找到audit_log.so。我的是在/usr/lib/mysql/plugin/文件夹下。 2、将...
  • 关于NDK编译.so中 android.mk文件基础

空空如也

空空如也

1 2 3 4
收藏数 79
精华内容 31
关键字:

关于so的用法