C/C++编程:acl网络编程封装

1059 篇文章 278 订阅

gethostaddr

封装.c

#include <stdlib.h>
#include <stdio.h>
#include <zconf.h>
#include <netdb.h>
#include <string.h>
#include <zconf.h>
#include <netdb.h>

#define ERROR printf
/**
 * 从字符串左边开始将包含给定分隔符在内的右边截断
 * @param string {char*} 源字符串
 * @param delimiter {int} 分隔符
 * @return {char*} 分隔符以右的字符串,当为NULL时表明未找到指定分隔符
 */
char *acl_split_at(char *s, int delimiter){
    char   *cp;

    if ((cp = strchr(s, delimiter)) != 0){
        *cp++ = 0;
    }

    return cp;
}
/**
 * 从字符串右边开始将包含给定分隔符在内的右边截断
 * @param string {char*} 源字符串
 * @param delimiter {int} 分隔符
 * @return {char*} 分隔符以右的字符串,当为NULL时表明未找到指定分隔符
 */
char *acl_split_at_right(char *s, int delimiter){
    char   *cp;

    if ((cp = strrchr(s, delimiter)) != 0)
        *cp++ = 0;
    return cp;
}

static int host_port(char *buf, char **host, char **port){
    char *cp = buf;
    cp = acl_split_at_right(buf, ':');
    *host =  buf ;
    *port = cp;
    return 0;
}

struct addrinfo *acl_host_addrinfo(const char *addr, int type)
{
    int    err;
    struct addrinfo hints, *res0;
    char  *buf = strdup(addr);
    char *host = NULL, *port = NULL;

    if (host_port(buf, &host, &port) < 0) {
        free(buf);
        return NULL;
    }

    memset(&hints, 0, sizeof(hints));
    hints.ai_family   = PF_UNSPEC;  // (IPv4 and IPv6)
    hints.ai_socktype = type; // SOCK_STREAM
    hints.ai_flags    = AI_V4MAPPED | AI_ADDRCONFIG; // 只有当主机配置了IPv4地址才进行查询IPv4地址;只有当主机配置了IPv6地址才进行查询IPv6地址
    // 如果同时指定ai_family为AF_INT6时,如果没有可用的AAAA记录,就i返回A记录对应的IPv4映射的IPV6地址
    if ((err = getaddrinfo(host, port, &hints, &res0))) {
        ERROR("%s(%d): getaddrinfo error %s, host=%s, addr=%s",
              __FILE__, __LINE__, gai_strerror(err), host, addr);
        free(buf);
        return NULL;
    }

    free(buf);
    return res0;
}

引出.h

struct addrinfo *acl_host_addrinfo(const char *addr, int type)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
acl 库是啥、主要包含哪些功能? acl 工程是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功能库。通过该库,用户可以非常容易地编写支持多种模式(多线程、多进程、非阻塞、触发器、UDP方式、协程方式)的服务器程序,WEB 应用程序,数据库应用程序。此外,该库还提供了常见应用的客户端通信库(如:HTTP、SMTP、ICMP、redis、disque、memcache、beanstalk、handler socket),常见流式编解码库:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 等。 ### 2、acl 库支持哪些平台? 目前主要支持 Linux/Windows/Macos/Freebsd/Solaris(x86)。 ### 3、acl 库主要包含几个库? 主要包括:lib_acl(用 C 语言写的基础库)、lib_protocol(用 C 语言写的一些网络应用协议库)、lib_acl_cpp(用 C++ 语言编写,封装了 lib_acl/lib_protocol 两个库,同时增加更多实用的功能库)、 lib_fiber(用 C 语言编写的支持高性能、高并发的网络协程库)、lib_rpc(用C++语言编写的封装了 google protobuf 网络库)。 ### 4、acl 库有哪些外部依赖库? lib_acl/lib_protocol/lib_fiber 仅依赖系统基础库;lib_acl_cpp 库的 db 模块依赖于 mysql 客户端库、sqlite 库,stream 流模块依赖于 polarssl 库(该库源码附在 acl/resource 目录下),另外,在 UNIX/LINUX 平台下还需要压缩库 --- libz 库(一般 LINUX 会自带该压缩库);lib_rpc 依赖于 protobuf 库。 ### 5、没有这些第三方库 acl 能否使用? 可以。默认情况下,没有这些第三方库编译和使用 acl 库是没有问题的,只是不能使用 mysql/sqlite/ssl/protobuf 功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值