• libevent学习五(Helper functions and types for Libevent)


    基础类型
     
    #ifdef WIN32
    #define evutil_socket_t intptr_t
    #else
    #define evutil_socket_t int
    #endif
    ev_ssize_t
     
    时间兼容函数
     
    //前2个参数的计算结果放到第三个参数里面
    #define evutil_timeradd(tvp, uvp, vvp) /* ... */
    #define evutil_timersub(tvp, uvp, vvp) /* ... */
     
    #define evutil_timerclear(tvp) /* ... */
    #define evutil_timerisset(tvp) /* ... */
     
    //前二个参数使用第三个参数指定的比较方式进行比较,其中cmp是所有标准C的关系运算符(>,<,==,<=,>=),成立返回true
    #define evutil_timercmp(tvp, uvp, cmp)
     
    //获取当前时间,timeval 是包含秒和微妙的结构体
    int evutil_gettimeofday(struct timeval *tv, struct timezone *tz);
     
    example:
    struct timeval tv1, tv2, tv3;

    /* Set tv1 = 5.5 seconds */
    tv1.tv_sec = 5; tv1.tv_usec = 500*1000;

    /* Set tv2 = now */
    evutil_gettimeofday(&tv2, NULL);

    /* Set tv3 = 5.5 seconds in the future */
    evutil_timeradd(&tv1, &tv2, &tv3);

    /* all 3 should print true */if (evutil_timercmp(&tv1, &tv1, ==))  /* == "If tv1 == tv1" */
       puts("5.5 sec == 5.5 sec");
    if (evutil_timercmp(&tv3, &tv2, >=))  /* == "If tv3 >= tv2" */
       puts("The future is after the present.");
    if (evutil_timercmp(&tv1, &tv2, <))   /* == "If tv1 < tv2" */
     
     
    兼容的socket API
     
    int evutil_closesocket(evutil_socket_t s);

    #define EVUTIL_CLOSESOCKET(s) evutil_closesocket(s)
     
    #define EVUTIL_SOCKET_ERROR()
    #define EVUTIL_SET_SOCKET_ERROR(errcode)
    #define evutil_socket_geterror(sock)
    #define evutil_socket_error_to_string(errcode)
     
    int evutil_make_socket_nonblocking(evutil_socket_t sock);
     
    int evutil_make_socket_closeonexec(evutil_socket_t sock);
     
    int evutil_socketpair(int family, int type, int protocol,
            evutil_socket_t sv[2]);
     
     
     
    方便的字符串操作函数
     
    ev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
    int evutil_snprintf(char *buf, size_t buflen, const char *format, ...);
    int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap);
     
    本地字符串操作函数
     
    int evutil_ascii_strcasecmp(const char *str1, const char *str2);
    int evutil_ascii_strncasecmp(const char *str1, const char *str2, size_t n);
     
     
    IPV6 相关函数
     
    const char *evutil_inet_ntop(int af, const void *src, char *dst, size_t len);
    int evutil_inet_pton(int af, const char *src, void *dst);
    int evutil_parse_sockaddr_port(const char *str, struct sockaddr *out,
        int *outlen);
    int evutil_sockaddr_cmp(const struct sockaddr *sa1,
        const struct sockaddr *sa2, int include_port);
     
    方便的结构宏
     
    #define evutil_offsetof(type, field) /* ... */
     
    安全的随机数发生器
     
    void evutil_secure_rng_get_bytes(void *buf, size_t n);
    int evutil_secure_rng_init(void);
    void evutil_secure_rng_add_bytes(const char *dat, size_t datlen);
     
     
     
     
  • 相关阅读:
    Redis 简介
    图片懒加载、selenium和PhantomJS
    Python网络爬虫之三种数据解析方式
    Scrapy框架之CrawlSpider
    Scrapy 框架
    python 网络爬虫概念与HTTP(s)协议
    Mysql概念及基本操作
    Python re 模块
    线程与进程应用场景
    全局解释器锁 GIL
  • 原文地址:https://www.cnblogs.com/manziluo/p/5789639.html
Copyright © 2020-2023  润新知