• 新发现的一些C函数


      今天看lsocket代码,发现有三个C函数,以前一直没有用过。

      觉得特别有意思,一个strspn,一个strrchr,一个getaddrinfo。

    • strspn

      #include <string.h>

      size_t strspn(const char *s , const char *accept);

      计算从字符串s的起始位置开始,连续并且完全属于accept字符串中字符的个数(有点绕)。

      直接上代码:

    char *addr = "127.0.0.1";
    int pfx = strspn(addr,"0123456789.");
    printf("pfx:%d 
    ",pfx);         // --> 9   就是说addr中所有的字符都属于 “01234567489.”
    
    char *bad = "12w.0.0.1";
    int bcount =  strspn(bad,"0123456789.");
    print("bcount: %d
    ",bcount);    // --> 2 就是说从bad字符串开始计算,只有前两个连续的字符才属于“0123456789.”
    • strrchr

      #include <string.h>

      char *strrchr(const char *s , int c);

      strrchr与strchr刚好相反,前者返回的是最后一次出现在s中的位置,后者返回第一次出现在s中的位置。

    char *str = "12345601234560123456";
    char *p ;
    p = strrchr(str,'5');
    printf("p:%s
    ",p);  //P: 56        说明找到了,是最后两个字符
    •  getaddrinfo

      以前一直都是用gethostbyname和gethostbyaddr,但是这两个函数仅支持IPv4。

      此外,getaddrinfo函数还能够处理名字到地址、服务到端口这两种转换。

    #include <sys/types.h>

      #include <sys/socket.h>

      #include <netdb.h>

      int getaddrinfo(const char *node,const char * service,const struct addrinfo *hints,struct addrinfo **res);

      返回一个sockaddr结构的链表,而不是一个地址清单。

      node》一个主机名或者地址串(IPv4的点分十进制、IPv6的16进制串)

      service》十进制的端口,或定义的服务名称,如ftp、http等

      hints》可以是一个空指针,也可以是addrinfo结构体指针,填入关于期望返回的信息类型。

          可以指定即支持TCP也可支持UDP,可以设置ai_socktype成员变量为SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。

      res》返回一个指向addrinfo结构体链表的指针。

      示例如下:

    type = SOCK_STREAM;
    struct addrinfo hint, *info = 0;
    char svc[TOSTRING_BUFSIZ];
    memset(&hint, 0, sizeof(hint));
    hint.ai_family = AF_UNSPEC;
    hint.ai_socktype = type;
    hint.ai_protocol = type == SOCK_STREAM ? IPPROTO_TCP : IPPROTO_UDP;
    if (_needsnolookup(addr))  //判断地址类型
        hint.ai_flags = AI_NUMERICHOST;
    snprintf(svc, TOSTRING_BUFSIZ , "%d", port);
    
    int err = getaddrinfo(addr, svc, &hint, &info);//0成功,非0出错

    成功之后就可以取数据:

    int         *family ;
    int         *protocol;
    socklen_t   *slen;
    struct sockaddr *sa;
    
    *family      = info->ai_family;
    *slen        = info->ai_addrlen;
    *protocol  = info->ai_protocol;
    memcpy(sa, info->ai_addr, *slen);

    最后不要忘记调用freeaddrinfo(info);

  • 相关阅读:
    Ellipse4SL 的安装包和环境配置要求
    什么是SOHO人
    D2上的Silverlight
    银光团队项目正式启动,欢迎您的参与!
    Silverlight开发团队招募SOHO团员若干
    SOHO新的生活方式
    [银客北京开发团队]承接各种Silverlight和WPF外包项目和合作项目
    微软Silverlight 3.0 概观
    grers
    翻译电文
  • 原文地址:https://www.cnblogs.com/daiker/p/5897198.html
Copyright © 2020-2023  润新知