新发现的一些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 \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函数的更多相关文章
- 新发现的mbstowcs, mbstowcs_s函数,转换多字节到宽字符
http://en.cppreference.com/w/c/string/multibyte/mbstowcs https://msdn.microsoft.com/fr-fr/library/ey ...
- 新发现一个函数:GradientFill
位于Msimg32.dll之中 https://msdn.microsoft.com/en-us/library/windows/desktop/dd144957(v=vs.85).aspx
- 10个鲜为人知的WordPress函数
WordPress功能强大,非常适合开发者使用.说到 WordPress,那么,我们不得不说他的钩子函数.今天,要为大家推荐10个WordPress函数.大多数,都是我们常用的功能,不过,经常不知道如 ...
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
- C语言函数指针(转载)
二.通常的函数调用 一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int a ...
- C语言函数名与函数指针详解
一.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(in ...
- 彻底搞定C指针--“函数名与函数指针”
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); 点击打开链 ...
- 彻底搞定C指针-函数名与函数指针【转】
转自:http://blog.csdn.net/a1232345/article/details/43524371 函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子://自行包含头 ...
随机推荐
- TDD中的单元测试
TDD中的单元测试写多少才够? 测试驱动开发(TDD)已经是耳熟能详的名词,既然是测试驱动,那么测试用例代码就要写在开发代码的前面.但是如何写测试用例?写多少测试用例才够?我想大家在实际的操作过程 ...
- CLR 的执行模型(2)
第一章 CLR 的执行模型(2) 本篇内容大纲 Framework 类库(Framework Class Library , FCL) 通用类型系统(Common Type System,CTS) 公 ...
- pearl(二分查找,stl)
最近大概把有关二分的题目都看了一遍... 嗯..这题是二分查找...二分查找的代码都类似,所以打起来会水很多 但是刚开始打二分还是很容易写挂..所以依旧需要注意 题2 天堂的珍珠 [题目描述] 我有很 ...
- 基于SUSE Linux做NFS文件挂载
linux文件挂载其实和windows文件共享原理差不多,由主机配置一个共享目录,客户端机器可以通过网络访问该共享目录. 下面以SUSE11为例子,简要描述下NFS文件挂载过程: 一.主机端(主机IP ...
- Cookie 操作工具类
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet ...
- 当Erlang遇到Solr
当Erlang遇到Solr Joe Armstrong的访谈中有一段关于"打开黑盒子"的阐述,给我留下很深的印象:Joe Armstrong在做XWindows开发时没有使用对 ...
- 关于Update语句的锁
关于Update语句的锁 环境:MSSQL2005,在Read Committed级别 语句A:begin tranUpdate Table Set f1='xxx' where f2='ttt' ...
- Codeforces Round #193 (Div. 2)
题目地址: http://codeforces.com/contest/332 第一题:题目又臭又长,读了好长时间才读懂. n个人,你是0号,从0开始到n-1循环做动作,只要你前面三个人动作一样,你就 ...
- mini2440裸机之I2C
// File Name : IIC.c // Function : S3C2440 IIC-bus Master Tx/Rx mode Test Program // (I ...
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
1. 模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...