今天看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. QQ三方登录步骤详解

    首先,登录QQ互联:http://connect.qq.com/intro/login  ,注册成为开发者 选择申请加入,并创建你的应用. 创建成功后可以获取到appid和appkey 在网站的主页引 ...

  2. asp.net 加入验证码

    验证码生成页面代码(清理掉没用的html) using System; using System.Collections.Generic; using System.Linq; using Syste ...

  3. NuGet安装及简单使用

    通过Visual Studio安装NuGet 直接下载并安装NuGet 一.通过Visual Studio安装NuGet 打开Visual Studio扩展管理器 2.选择联机库,并在搜索中写入NuG ...

  4. JS核心概念

    Javascript本质第一篇:核心概念   很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽 ...

  5. 初试KONCKOUT+WEBAPI简单实现增删改查

    初试KONCKOUT+WEBAPI简单实现增删改查 前言 konckout.js本人也是刚刚接触,也是初学,本文的目的是使用ko和asp.net mvc4 webapi来实现一个简单增删改查操作.Kn ...

  6. BEncoding的编码与解码

    BEncoding的编码与解码   1. BEncoding规则 BEncoding是BitTorrent用在传输数据结构的编码方式,我们最熟悉的“种子”文件,它里面的元数据就是 BEncoding ...

  7. mac os 上安装mysqldb血泪史

    昨天下午在mac上安装mysql-python一直未遂今天查了很多资料终于成功了 最后还是在stackoverflow点击打开链接(好网站啊,一般有什么技术问题在这都能找到)上找到了答案,废话少数: ...

  8. revel框架教程之CSRF(跨站请求伪造)保护

    revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...

  9. HTTP header 介绍

    HTTP(Hyper Text Transfer Protocol)是超文本传输协议的缩写,它用于传送www方式的数据.HTTP协议采用了请求/响应模型.客服端向服务器发送一个请求,请求头包含请求的方 ...

  10. Hadoop Streaming框架学习2

    Hadoop Streaming框架学习(二) 1.常用Streaming命令介绍 使用下面的命令运行Streaming MapReduce程序: 1: $HADOOP_HOME/bin/hadoop ...