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

  #include <string.h>

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

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

char *str = "";
char *p ;
p = strrchr(str,'');
printf("p:%s\n",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 = ;
char svc[TOSTRING_BUFSIZ];
memset(&hint, , 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);

新发现的一些C函数的更多相关文章

  1. 新发现的mbstowcs, mbstowcs_s函数,转换多字节到宽字符

    http://en.cppreference.com/w/c/string/multibyte/mbstowcs https://msdn.microsoft.com/fr-fr/library/ey ...

  2. 新发现一个函数:GradientFill

    位于Msimg32.dll之中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd144957(v=vs.85).aspx

  3. 10个鲜为人知的WordPress函数

    WordPress功能强大,非常适合开发者使用.说到 WordPress,那么,我们不得不说他的钩子函数.今天,要为大家推荐10个WordPress函数.大多数,都是我们常用的功能,不过,经常不知道如 ...

  4. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

  5. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  6. C语言函数指针(转载)

    二.通常的函数调用 一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int a ...

  7. C语言函数名与函数指针详解

    一.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(in ...

  8. 彻底搞定C指针--“函数名与函数指针”

    函数名与函数指针   一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ...

  9. 彻底搞定C指针-函数名与函数指针【转】

    转自:http://blog.csdn.net/a1232345/article/details/43524371 函数名与函数指针 一 通常的函数调用    一个通常的函数调用的例子://自行包含头 ...

随机推荐

  1. 数组自定义排序:IComparable和IComparer接口

    首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...

  2. Python Learing(一):Basic Grammar

    装了python2.7,去图书馆借了python入门经典,暂且简单写下学习笔记,以供自己回忆 学习笔记(一)主要是基础语法部分: 1.python中数字以及字符串的使用; 2.输入与输出语句; 3.逻 ...

  3. C# 让程序自动以管理员身份运行

    exe在Vista或Win7下不以管理员权限运行,会被UAC(用户帐户控制)阻止访问系统某些功能,如修改注册表操作等;如何让exe以管理员权限运行呢,方法有两种,一个是直接修改exe属性;另一个是在程 ...

  4. GNU 项目(开源社区的由来,背后的哲学)

    转自译言网:http://article.yeeyan.org/view/88497/59257/ 第一个软件共享社区 当我在1971年开始在麻省理工人工智能实验室工作时, 我成为一个已经存在多年的软 ...

  5. 三.redis 排序

    本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT ...

  6. 异常信息:java.lang.OutOfMemoryError: PermGen space

    修改TOMCAT_HOME/bin/catalina.sh 在"echo "Using CATALINA_BASE:    $CATALINA_BASE""上面 ...

  7. Exchange 2016 创建日程,远程服务器返回错误: (401) 未经授权

    背景:在测试环境中一切正常,使用的是Exchange2013,上生产环境Exchange2016,部署后产生如下错误: Microsoft.Exchange.WebServices.Data.Serv ...

  8. Newtonsoft.Json 时区差解决方法

    在使用Newtonsoft.Json时会遇到这样的问题,数据库存的值跟接收到反序列的值差了8个小时.这时,只要在反序列化时设置一下就可以了. JsonConvert.DeserializeObject ...

  9. Machine Learning/Introducing Logistic Function

    Machine Learning/Introducing Logistic Function 打算写点关于Machine Learning的东西, 正好也在cnBlogs上新开了这个博客, 也就更新在 ...

  10. POJ 1873 The Fortified Forest

    题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树.. 思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行. ...