网络

最近用libcurl向某商web服务器作登录校验踩了一坑。

事情的表象是这样的,在windows上没有问题,linux上投递过去的数据乱码。但是如果将curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data)中的data写死,即写成字符串常量,也是没有问题的。

开始以为一些参数和环境的问题,查了半天问题依旧,才怀疑到变量生存周期的问题,将data生命期拉长,就好了。

从6月1日起,苹果审核要求支持IPv6 DNS64/NAT64网络了。

我们服务器和客户端都是Socket编程,IPv4地址。最后参照https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1,在客户端处理下即可。

需要说明的是, 在上述文档Apple给出的Listing 10-1  Using getaddrinfo to resolve an IPv4 address literal中,error = getaddrinfo(ipv4_str, "http", &hints, &res0);
经测试,在IOS下,第一个参数为IPv4地址的情况下,第二个参数为http,ftp等常用字符串,服务器此时监听端口需改为协议默认端口才可能;或者第一个参数为域名,第二个参数为数字端口;

不支持第一个参数为IPv4地址,第二个参数为数字端口。坑爹。有两种方法解决这个问题 : 
1) 域名+数字端口。
2) 先getaddrinfo, 再获取sockaddr_in或者sockaddr_in6,设置sin_port或sin6_port。
关于IPv6,可以参考下几篇文章:
https://tools.ietf.org/html/rfc4038
https://github.com/WeMobileDev/article/blob/master/IPv6%20socket编程.md

初识HTTP/2

前几天,HTTP/2正式通过了IETF组织的批准得以正式发布。

大致上,HTTP/2设计的主要目的是为了提升效率,更新主要体现在:

以帧为基本单位

每一帧的组成:Length(24),Type(8),Flags(8),R(1),Stream Identifier(31),Frame Payload(…).

流与多路复用

流由序列帧构成;

流具体这些状态:idle, reserved(local), reserved(remote),open,half closed(local),half closed(remote),closed;

流由31位无符号整形标识;客户端使用奇数,服务器使用偶数;

可以对单个流或者整个连接进行流量控制;

流具有优先级,可以改变;

服务器推送

服务器将会在客户端需要前提前将数据发送给客户端Cache。当然,也可以取消这一设置。

Header压缩与解压

 

具体参考这里:http://http2.github.io/http2-spec/index.html