socket5协议简析

下面是socket5代理协议的翻译,来自于此处

译者:Radeon(Radeon bise@cmmail.com)
译文发布时间:2001-6-18

目录

1.介绍
2.现有的协议
3.基于TCP协议的客户
4.请求
5.地址
6.应答
7.基于UDP协议的客户
8. 安全性考虑
9. 参考书目

1.介绍

利用网络防火墙可以将组织内部的网络结构从外部网络如INTERNET中有效地隔离,这种方法在许多网络系统中正变得流行起来。这种防火墙系统通常以应用层网关的形式工作在两个网络之间,提供TELNET、FTP、SMTP等的接入。随着越来越多的使全球信息查找更容易的复杂的应用层协议的出现,有必要提供一个通用框架来使这些协议安全透明地穿过防火墙。而且在实际应用中还需要一种安全的认证方式用以穿越防火墙。这个要求起源于两个组织的网络中客户/服务器关系的出现,这个关系需要得到控制并要求有安全的认证。
在这儿所描述的协议框架是为了让使用TCP和UDP的客户/服务器应用程序更方便安全地使用网络防火墙所提供的服务所设计的。这个协议从概念上来讲是介于应用层和传输层之间的“中介层(shim-layer)”,因而不提供如传递ICMP信息之类由网络层网关的所提供的服务。

2.现有的协议
当前存在一个协议SOCKS 4,它为TELNET、FTP、HTTP、WAIS和GOPHER等基于TCP协议的客户/服务器程序提供了一个不安全的防火墙。而这个新的协议扩展了SOCKS V4,以使其支持UDP、框架规定的安全认证方案、地址解析方案(addressing scheme)中所规定的域名和IPV6。为了实现这个SOCKS协议,通常需要重新编译或者重新链接基于TCP的客户端应用程序以使用SOCKS库中相应的加密函数。
注意:
除非特别注明,所有出现在数据包格式图中的十进制数字均以字节表示相应域的长度。如果某域需要给定一个字节的值,用X’hh’来表示这个字节中的值。如果某域中用到单词’Variable’,这表示该域的长度是可变的,且该长度定义在一个和这个域相关联(1 – 2个字节)的域中,或一个数据类型域中。

3.基于TCP协议的客户
当一个基于TCP协议的客户端希望与一个只能通过防火墙可以到达的目标(这是由实现所决定的)建立连接,它必须先建立一个与SOCKS服务器上SOCKS端口的TCP连接。通常这个TCP端口是1080。当连接建立后,客户端进入协议的“握手(negotiation)”过程:认证方式的选择,根据选中的方式进行认证,然后发送转发的要求。SOCKS服务器检查这个要求,根据结果,或建立合适的连接,或拒绝。
除非特别注明,所有出现在数据包格式图中的十进制数字均以字节表示相应域的长度。如果某域需要给定一个字节的值,用X’hh’来表示这个字节中的值。如果某域中用到单词’Variable’,这表示该域的长度是可变的,且该长度定义在一个和这个域相关联(1 – 2个字节)的域中,或一个数据类型域中。
客户端连到服务器后,然后就发送请求来协商版本和认证方法:

VER NMETHODS METHODS
1 1 1 to 255

这个版本的SOCKS协议中,VER字段被设置成X’05’。NMETHODS字段包含了在METHODS字段中出现的方法标示的数目(以字节为单位)。
服务器从这些给定的方法中选择一个并发送一个方法选中的消息回客户端:

VER METHOD
1 1

如果选中的消息是X’FF’,这表示客户端所列出的方法列表中没有一个方法被选中,客户端必须关闭连接。
当前定义的方法有:
· X’00’ 不需要认证
· X’01’ GSSAPI
· X’02’ 用户名/密码
· X’03’ — X’7F’ 由IANA分配
· X’80’ — X’FE’ 为私人方法所保留的
· X’FF’ 没有可以接受的方法
然后客户和服务器进入由选定认证方法所决定的子协商过程(sub-negotiation)。各种不同的方法的子协商过程的描述请参考各自的备忘录。
开发者如果要为自己的方法得到一个方法号,可以联系IANA。可以参考关于已经被分配号码的文档以得到当前所有方法的列表和相应的协议。
符合本文档的SOCKS V5实现必须支持GSSAPI,并且在将来支持用户名/密码认证方式。

4.请求

一旦子协商过程结束后,客户端就发送详细的请求信息。如果协商的方法中有以完整性检查和/或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。
SOCKS请求的格式如下:

VER CMD RSV ATYP DST.ADDR DST.PROT
1 1 X’00’ 1 Variable 2

其中
· VER 协议版本: X’05’
· CMD
· CONNECT:X’01’
· BIND:X’02’
· UDP ASSOCIATE:X’03’
· RSV 保留
· ATYP 后面的地址类型
· IPV4:X’01’
· 域名:X’03’
· IPV6:X’04’’
· DST.ADDR 目的地址
· DST.PORT 以网络字节顺序出现的端口号
SOCKS服务器会根据源地址和目的地址来分析请求,然后根据请求类型返回一个或多个应答。

5.地址
ATYP字段中描述了地址字段(DST.ADDR,BND.ADDR)所包含的地址类型:
· X’01’
基于IPV4的IP地址,4个字节长
· X’03’
基于域名的地址,地址字段中的第一字节是以字节为单位的该域名的长度,没有结尾的NUL字节。
· X’04’
基于IPV6的IP地址,16个字节长

6.应答
一旦建立了一个到SOCKS服务器的连接,并且完成了认证方式的协商过程,客户机将会发送一个SOCKS请求信息给服务器。服务器将会根据请求,以如下格式返回:

VER REP RSV ATYP BND.ADDR BND.PORT
1 1 X’00’ 1 Variable 2

其中:
· VER 协议版本: X’05’
· REP 应答字段:
· X’00’ 成功
· X’01’ 普通的SOCKS服务器请求失败
· X’02’ 现有的规则不允许的连接
· X’03’ 网络不可达
· X’04’ 主机不可达
· X’05’ 连接被拒
· X’06’ TTL超时
· X’07’ 不支持的命令
· X’08’ 不支持的地址类型
· X’09’ – X’FF’ 未定义
· RSV 保留
· ATYP 后面的地址类型
· IPV4:X’01’
· 域名:X’03’
· IPV6:X’04’
· BND.ADDR 服务器绑定的地址
· BND.PORT 以网络字节顺序表示的服务器绑定的段口
标识为RSV的字段必须设为X’00’。
如果选中的方法中有以完整性检查和/或安全性为目的的封装,这些应答必须按照该方法所定义的方式进行封装。

CONNECT
在对一个CONNECT命令的应答中,BND.PORT包含了服务器分配的用来连到目标机的端口号,BND.ADDR则是相应的IP地址。由于SOCKS服务器通常有多个IP,应答中的BND.ADDR常和客户端连到SOCKS服务器的那个IP不同。

SOCKS服务器可以利用DST.ADDR和DST.PORT,以及客户端源地址和端口来对一个CONNECT请求进行分析。

BIND
BIND请求通常被用在那些要求客户端接受来自服务器的连接的协议上。FTP是一个典型的例子。它建立一个从客户端到服务器端的连接来执行命令以及接收状态的报告,而使用另一个从服务器到客户端的连接来接收传输数据的要求(如LS,GET,PUT)。
建议只有在一个应用协议的客户端在使用CONNECT命令建立主连接后才可以使用BIND命令建立第二个连接。建议SOCKS服务器使用DST.ADDR和DST.PORT来评价BIND请求。
在一个BIND请求的操作过程中,SOCKS服务器要发送两个应答给客户端。当服务器建立并绑定一个新的套接口时发送第一个应答。BND.PORT字段包含SOCKS服务器用来监听进入的连接的端口号,BAND.ADDR字段包含了对应的IP地址。客户端通常使用这些信息来告诉(通过主连接或控制连接)应用服务器连接的汇接点。第二个应答仅发生在所期望到来的连接成功或失败之后。在第二个应答中,BND.PORT和BND.ADDR字段包含了连上来的主机的IP地址和端口号。

UDP ASSOCIATE
UDP ASSOCIATE请求通常是要求建立一个UDP转发进程来控制到来的UDP数据报。DST.ADDR和DST.PORT 字段包含客户端所希望的用来发送UDP数据报的IP地址和端口号。服务器可以使用这个信息来限制进入的连接。如果客户端在发送这个请求时没有地址和端口信息,客户端必须用全0来填充。
当与UDP相应的TCP连接中断时,该UDP连接也必须中断。
应答UDP ASSOCIATE请求时,BND.PORT 和BND.ADDR字段指明了客户发送UDP消息至服务器的端口和地址。

应答处理
当一个应答(REP值不等于00)指明出错时,SOCKS服务器必须在发送完应答消息后一小段时间内终止TCP连接。这段时间应该在发现错误后少于10秒。
如果一个应答(REP值等于00)指明成功,并且请求是一个BIND或CONNECT时,客户端就可以开始发送数据了。如果协商的认证方法中有以完整性、认证和/或安全性为目的的封装,这些请求必须按照该方法所定义的方式进行封装。类似的,当以客户机为目的地的数据到达SOCKS服务器时,SOCKS服务器必须用正在使用的方法对这些数据进行封装。

7.基于UDP协议的客户
在UDP ASSOCIATE应答中由BND.PORT指明了服务器所使用的UDP端口,一个基于UDP协议的客户必须发送数据报至UDP转发服务器的该端口上。如果协商的认证方法中有以完整性、认证和/或安全性为目的的封装,这些数据报必须按照该方法所定义的方式进行封装。每个UDP数据报都有一个UDP请求头在其首部:

RSV FRAG ATYP DST.ADDR DST.PORT DATA
2 1 1 Variable 2 Variable

在UDP请求头中的字段是:

· RSV 保留 X’0000’
· FRAG 当前的分段号
· ATYP 后面的地址类型
· IPV4:X’01’
· 域名:X’03’
· IPV6:X’04’
· DST.ADDR 目的地址
· DST.PORT 以网络字节顺序出现的端口号
· DATA 用户数据
当一个UDP转发服务器转发一个UDP数据报时,不会发送任何通知给客户端;同样,它也将丢弃任何它不能发至远端主机的数据报。当UDP转发服务器从远端服务器收到一个应答的数据报时,必须加上上述UDP请求头,并对数据报进行封装。
UDP转发服务器必须从SOCKS服务器得到期望的客户端IP地址,并将数据报发送到UDP ASSOCIATE应答中给定的端口号。如果数据报从任何IP地址到来,而该IP地址与该特定连接中指定的IP地址不同,那么该数据报会被丢弃。
FRAG字段指明数据报是否是一些分片中的一片。如果SOCKS服务器要实现这个功能,X’00’指明数据报是独立的;其他则越大越是数据报的尾端。介于1到127之间的值说明了该分片在分片序列里的位置。每个接收者都为这些分片提供一个重组队列和一个重组的计时器。这个重组队列必须在重组计时器超时后重新初始化,并丢弃相应的数据报。或者当一个新到达的数据报有一个比当前在处理的数据报序列中最大的FRAG值要小时,也必须重新初始化从组队列。重组计时器必须小于5秒。只要有可能,应用程序最好不要使用分片。
分片的实现是可选的;如果某实现不支持分片,所有FRAG字段不为0的数据报都必须被丢弃。
一个SOCKS的UDP编程界面(The programming interface for a SOCKS-aware UDP)必须报告当前可用UDP数据报缓存空间小于操作系统提供的实际空间。
· 如果 ATYP是 X’01’ – 10+method_dependent octets smaller
· 如果 ATYP是X’03’ – 262+method_dependent octets smaller
· 如果 ATYP是X’04’ – 20+method_dependent octets smaller

8. 安全性考虑
这篇文档描述了一个用来透过IP网络防火墙的应用层协议。这种传输的安全性在很大程度上依赖于特定实现所拥有以及在SOCKS客户与SOCKS服务器之间经协商所选定的特殊的认证和封装方式。
系统管理员需要对用户认证方式的选择进行仔细考虑。

作者地址
Marcus Leech
Bell-Northern Research Ltd
P.O. Box 3511, Station C
Ottawa, ON
CANADA K1Y 4H7
Phone: (613) 763 – 9145
EMail: mleech@bnr.ca

ruby,python,元编程

先来说说ruby的元编程
ruby中的动态方法只要跟send, define_method, method_missing这几个方法相关。

send
class SendClass
def get_one_name
‘one_name’
end

def get_two_name
‘two_name’
end

def get_three_name
‘three_name’
end
end

s = SendClass.new

puts s.send(:get_one_name) #one_name
puts s.send(:get_two_name) #two_name
puts s.send(:get_three_name)#three**name
puts s.send(:get_four_name) #undefined method `get_four_name’

send方法至少要有一个参数,这个参数就是要调用的方法名,如果找不到这个方法,就会报undefined method的错误,send方法用处也是比较多的,如果有一个对象有很多属性,但是调用这些属性方法时,如果不知道要调用的是哪个属性,就可以用这个方法。

但是send调用的这些方法还是必须存在的呀,并不是一些动态的方法,只是动态调用,那么有没有可能动态定义方法呢?别急,这就是我们要介绍的define_method方法。
define_method

class SendClass
#def get_one_name
# ‘one_name’
#end

#def get_two_name
# ‘two_name’
#end

#def get_three_name
# ‘three_name’
#end
[:one_name, :two_name, :three_name].each do |name|
define_method(“get_#{name}”){
name
}
end
end

s = SendClass.new

puts s.send(:get_one_name) #one_name
puts s.send(:get_two_name) #two_name
puts s.send(:get_three_name)#three_name
puts s.send(:get_four_name) #undefined method `get_four_name’

看吧,达到了同样的效果,只用了一条语句就定义了几个方法,那么还有没有其他方法能达到这样的效果呢?答案是肯定的,那就是method_missing。
method_missing
method_missing是一个魔鬼方法,使用不当的情况下,会发生很多意想不到的问题。不过它还是很有用的,在介绍它之前,我们先会议一下方法的查找,遵循右上法则,直到找到BasicObject中。那么我们看看BasicObject有没有这个方法。

1.9.3-p551 :016 > BasicObject.method(:method_missing)
=> #
找到了,method_missing方法是定义在BasicObject方法内,那么它是怎么使用的呢?
实际上我们调用一个方法,如果对象无法找不到这个方法,就会调用method_missing方法,我们举个例子:

class SendClass
def get_one_name
‘one_name’
end

def get_two_name
‘two_name’
end

def get_three_name
‘three_name’
end

def method_missing(name, *argc)
‘call method_missing’
end
end

s = SendClass.new

puts s.send(:get_one_name) #one_name
puts s.send(:get_two_name) #two_name
puts s.send(:get_three_name)#three_name
puts s.send(:get_four_name) #call method_missing
我们基于这个原理实现一下动态方法:
[ruby] view plain copy

在CODE上查看代码片派生到我的代码片
class SendClass
def method_missing(name, *argc)
if [:one_name, :two_name, :three_name].include?(name)
name
else #处理不了的方法就让父类处理
super
end
end
end

s = SendClass.new

puts s.one_name #one_name
puts s.two_name #two_name
puts s.three_name #three_name
puts s.four_name #undefined method `four_name’

一般情况下会是send, define_method, method_missing三个方法同时使用:
[ruby] view plain copy

在CODE上查看代码片派生到我的代码片
class SendClass
[:one_name, :two_name, :three_name].each do |name|
define_method(“get_#{name}”){
name
}
end

def method_missing(name, *argc)
if self.respond_to?(name)
send(:name)
else #处理不了的方法就让父类处理
super
end
end
end

s = SendClass.new

puts s.get_one_name #one_name
puts s.get_two_name #two_name
puts s.get_three_name #three_name
puts s.get_four_name #undefined method `get_four_name’
其他
在最后,我们讲解一些细节
走到method_missing的方法并不是真正的方法
举个例子:
[ruby] view plain copy

在CODE上查看代码片派生到我的代码片
class SendClass
def method_missing(name, *argc)
if [:one_name, :two_name, :three_name].include?(name)
name
else #处理不了的方法就让父类处理
super
end
end
end

s = SendClass.new

puts s.respond_to?(:one_name)#false
puts s.respond_to?(:two_name)#false
puts s.respond_to?(:three_name)#false
method_missing方法是方法调用找不到对应方法的时候就会调用method_missing方法,但是这些方法不会真正被定义,只能算是一个异常机制。
method_missing有性能问题
method_missing虽然好用,但是会有一定的性能损失,为什么呢?还记得我们说到的方法查找吗,遵循右上的原则,最终找不到的时候才会报错。
[ruby] view plain copy

在CODE上查看代码片派生到我的代码片
class BasicObject
def method_missing(name, *argc)
puts ‘call BasicObject method_missing’
super
end
end

class Object
def method_missing(name, *argc)
puts ‘call Object method_missing’
super
end
end

class SendClass
def method_missing(name, *argc)
if [:one_name, :two_name, :three_name].include?(name)
name
else #处理不了的方法就让父类处理
puts ‘call SendClass method_missing’
super
end
end
end

s = SendClass.new

puts s.four_name

执行这段代码:

call SendClass method_missing
call Object method_missing
call BasicObject method_missing
send.rb:4:in method_missing': class or module required (TypeError)
from send.rb:11:in
method_missing’
from send.rb:21:in method_missing'
from send.rb:28:in

这就是方法查找,如果four_name方法在对象链中都找不到,就会查找对象链中method_missing方法,逐个调用,直到真正找不到这个方法。方法查找是有一定的性能损失,所以说mthod_missing方法是一定的性能损失。
真正方法的优先级高于method_missing方法
如果一个对象有这个方法,肯定不会调用method_missing方法,这个就不介绍了,这也是method_missing方法的用途,如果低于method_missing方法,那么method_missing还有什么用呢?

接下来说说python的

1.动态派发,其实这是一种很直观的做法,就是在调用类方法时候,找不到调用的方法,则会默认调用一个魔术方法,需要在魔术方法里处理实际的调用。

ruby里是用method_missing实现,python里面则是getattr,其实python里面还有一个getattribute方法,区别是前者只在类属性不存在的时候调用。有一点注意的是,在python里,方法也是一种对象,所以调用方法也是先获取类属性。下面是一个例子,为了简单,返回的是lambda,而不是一个函数,缺点就是没那么直观,要返回一个可调用对象而不是直接调用某个方法。

class A:
def getattr(self,name):
return lambda x:print(name)

a=A()
a.x
<function A.__getattr__.. at 0x02F13B28>
a.call()
Traceback (most recent call last):
File “<pyshell#15>”, line 1, in
a.call()
TypeError: () missing 1 required positional argument: ‘x’
a.call(1)
call

2.给对象增加属性,可以给对象实例通过setattr来设置属性,或者可以直接给类增加属性。和方法一相比,区别就是增加了属性,可以在dir里看到对象的属性。看到下面的代码也可以看出实例和类设置属性的区别,实例设置属性其实并不是对象的方法,而只是一个函数类型的属性。给类设置函数类型的属性之后,类实例化之后,会当做实例的方法。所以实例设置属性的时候,是不需要传递self,类方法设置的时候,函数需要传入self参数。类实例设置属性时候,如果需要获取self,可以在某个方法,比如init设置属性的时候,通过作用域传入到函数对象里面。

class A:
pass

dir(a)
[‘class‘, ‘delattr‘, ‘dict‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattr‘, ‘getattribute‘, ‘gt‘, ‘hash‘, ‘init‘, ‘le‘, ‘lt‘, ‘module‘, ‘ne‘, ‘new‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘setattr‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘weakref‘]
def m(x):
print(x)

setattr(a,’m’,m)
dir(a)
[‘class‘, ‘delattr‘, ‘dict‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattr‘, ‘getattribute‘, ‘gt‘, ‘hash‘, ‘init‘, ‘le‘, ‘lt‘, ‘module‘, ‘ne‘, ‘new‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘setattr‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘weakref‘, ‘m’]
a.m

a.m()
Traceback (most recent call last):
File “<pyshell#24>”, line 1, in
a.m()
TypeError: m() missing 1 required positional argument: ‘x’
a.m(10)
10

A.m=m

a.m

b=A()
dir(b)
[‘class‘, ‘delattr‘, ‘dict‘, ‘dir‘, ‘doc‘, ‘eq‘, ‘format‘, ‘ge‘, ‘getattr‘, ‘getattribute‘, ‘gt‘, ‘hash‘, ‘init‘, ‘le‘, ‘lt‘, ‘module‘, ‘ne‘, ‘new‘, ‘reduce‘, ‘reduce_ex‘, ‘repr‘, ‘setattr‘, ‘sizeof‘, ‘str‘, ‘subclasshook‘, ‘weakref‘, ‘m’]
b.m
<bound method m of >

b.m(1)
Traceback (most recent call last):
File “<pyshell#31>”, line 1, in
b.m(1)
TypeError: m() takes 1 positional argument but 2 were given

Source: xundaoinfo

开放平台资源集锦

策划设计

icon下载

Easyicon:http://www.easyicon.net/

Findicons:http://findicons.com/

淘宝icon库:http://www.iconfont.cn/

IconArchive:http://www.iconarchive.com/

Dryicons:http://dryicons.com/

Iconmonstr:http://iconmonstr.com/

图片下载

全景图:http://www.quanjing.com/

Pixabay:http://pixabay.com/

千图网:http://www.58pic.com/

昵图网:http://www.nipic.com/

Twitter Covers:http://www.twitrcovers.com/

韩国Photo Naver:http://photo.naver.com/

网页模板

CSSwinner:http://www.csswinner.com/

CSSawards:http://cssdesignawards.com/

Awwwards:http://www.awwwards.com/

突唯阿:http://tuweia.cn/c/home/a/discovery

Reeoo:http://reeoo.com/

日本酷站索引:http://bm.straightline.jp/

字体设计

字体松鼠:http://www.fontsquirrel.com/

A5字体:http://ziti.admin5.com/

找字体:http://www.zhaozi.cn/

字体下载宝库:http://font.knowsky.com/

Abstract字体:http://www.abstractfonts.com/

Font Fabric:http://fontfabric.com/

logo设计

Logopond:http://logopond.com/

Easylogo:http://www.easylogo.cn/

LogoMoose:http://www.logomoose.com/

Logo Faves:http://logofaves.com/

logo狂热者:http://logofury.com/

Logo挚爱:http://www.logodesignlove.com/

综合ui

Freepik:http://www.freepik.com/

Codrops:http://tympanus.net/codrops/

站酷:http://www.zcool.com.cn/

Codepen:http://codepen.io/

Designmodo:http://designmodo.com/

Pixeden:http://www.pixeden.com/

创意灵感

Pinterest:http://www.pinterest.com/all/design/

9GAG:http://9gag.com/

Fubiz:http://www.fubiz.net/

花瓣:http://huaban.com/

视觉中国:http://shijue.me/home

Booooooom:http://www.booooooom.com/

功能开发

推送

百度云推送:http://developer.baidu.com/cloud/push

个推:http://www.igetui.com/

极光推送:http://www.jpush.cn/

友盟推送:http://www.umeng.com/push/

Bmob推送:http://www.codenow.cn/

华为推送:http://developer.huawei.com/push/

地图

百度地图:http://developer.baidu.com/map/index.php?title=%E9

高德地图:http://lbs.amap.com/

谷歌地图:https://developers.google.com/

腾讯地图:http://open.map.qq.com/

苹果地图:https://developer.apple.com/cn/

搜狗地图:http://map.sogou.com/api/?IPLOC=CN4101

社区化分享

ShareSDK:http://mob.com/

百度社会化分享:http://developer.baidu.com/soc/share

友盟社会化分享:http://www.umeng.com/social

Bshare:http://www.bshare.cn/

IM

环信:http://www.easemob.com/

融云即时通讯云:http://www.rongcloud.cn/

容联·云通讯:http://www.yuntongxun.com/

亲加即时通讯云:http://gotye.com.cn/

呀呀语音:http://www.yunva.com:8080/yunva/home.html

语音识别

科大讯飞语音:http://open.voicecloud.cn/

微信语音:http://pr.weixin.qq.com/

百度语音识别:http://developer.baidu.com/wiki/index.php?title=do

云知声:http://dev.hivoice.cn/usc.jsp

搜狗语音云:http://openspeech.sogou.com/Sogou/php/index.php

出门问问:http://www.mobvoi.com/

第三方登录

腾讯QQ互联平台:http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD

百度第三方账号登陆:http://developer.baidu.com/frontia/sociallogin

人人连接:http://wiki.dev.renren.com/wiki/Renren_Connect

小米账号登陆:http://dev.xiaomi.com/doc/?page_id=1668

输入法

百度输入法:http://developer.baidu.com/ms/input

搜狗输入法:http://shouji.sogou.com/open/

FIT输入法:http://funinput.com/

人脸识别

Face++人脸识别:http://www.faceplusplus.com.cn/

ReKognition人脸识别:http://rekognition.com/

百度人脸识别:http://developer.baidu.com/wiki/index.php?title=do

汉王云人脸识别:http://developer.hanvon.com/

支付平台

支付宝开放平台:https://openhome.alipay.com/doc/docIndex.html

银联开放平台:http://mobile.unionpay.com/

360移动开放平台:http://dev.360.cn/

机锋支付:http://www.gfan.com/dev/gpay/

翻译

百度翻译:http://developer.baidu.com/ms/translate

有道翻译:http://fanyi.youdao.com/openapi

谷歌翻译:https://developers.google.com/translate/?hl=zh-cn

生活服务

聚合数据:http://www.juhe.cn/

中国天气:http://smart.weather.com.cn/wzfw/smart/weatherapi.

快递100:http://www.kuaidi100.com/openapi/

PM25in:http://www.pm25.in/

视频服务

优酷开放平台:http://open.youku.com/down

迅雷云加速开放平台:http://open.xunlei.com/

百度云视频开放平台:http://developer.baidu.com/wiki/index.php?title=do

爱奇艺开放平台:http://open.iqiyi.com/

快速开发

简网app工厂:http://www.cutt.com/app

腾讯风铃:http://fl.qq.com/

Appmakr:http://appmakr.com/

Basic4Android:http://www.basic4ppc.com/

AnySDK:http://www.anysdk.com/

云适配:http://www.yunshipei.com/

社区

新浪微博开放平台:http://open.weibo.com/

天涯开放平台:http://open.tianya.cn/index.php

百度贴吧SDK:http://c.tieba.baidu.com/c/s/download/pc?src=webtb

流量创收

百度联盟:http://union.baidu.com/

同程网开放平台:http://union.ly.com/

携程网站联盟:http://open.ctrip.com/

淘宝联盟开放平台:http://u.alimama.com/

手游录像

爱拍RecNow:http://recnow.aipai.com/

ShareRec:http://rec.mob.com/

Kamcord SDK:http://www.kamcord.com/

EveryPlay SDK:https://developers.everyplay.com/

LobiRec SDK:http://qiita.com/KAMEDAkyosuke/items/ee85d8943b974

运营服务

安全加固

爱加密:http://www.ijiami.cn/

Apkprotect:http://apkprotect.com/

统计分析

友盟应用统计分析:http://www.umeng.com/analytics

百度移动统计:http://mtj.baidu.com/web/welcome/login

机锋统计:http://www.gfan.com/dev/analytics/

友盟游戏统计分析:http://www.umeng.com/analytics_games

云服务

云计算

华为云服务:http://www.hwclouds.com/

亚马逊AWS:http://www.amazonaws.cn/

阿里云:http://www.aliyun.com/

盛大云计算:http://www.grandcloud.cn/

美团云:https://mos.meituan.com/

新浪云计算:http://sinacloud.com/

云存储

百度云数据库:http://developer.baidu.com/cloud/db

七牛云存储:http://www.qiniu.com/

又拍云:https://www.upyun.com/

新浪微盘:http://vdisk.weibo.com/developers/

Bmob:http://www.codenow.cn/

云引擎

阿里云:http://www.aliyun.com/product/ace/

百度应用引擎BAE:http://developer.baidu.com/cloud/rt

盛大云引擎:http://www.grandcloud.cn/product/ae

火山云引擎:http://www.volit.net/

云测试

云测:http://www.testin.cn/

京东云峰:http://maengine.jd.com/product/162

易测云:http://www.yiceyun.com/

百度云众测:http://developer.baidu.com/yunzhongce

Testbird:http://www.testbird.com/

中国移动终端池:http://dev.10086.cn/rts/rts/rts-home.do

其它云服务

汉王云:http://developer.hanvon.com/

搜狐sendcloud:http://sendcloud.sohu.com/

灵云:http://www.hcicloud.com/

百度定位云:http://lbsyun.baidu.com/location

百度地址搜索云:http://lbsyun.baidu.com/search

kiiCloud:http://cn.kii.com/

视频云

保利威视:http://www.polyv.net/

CC视频:http://www.bokecc.com/

未来云:http://asdtv.com/

石山视频:http://smvp.cn/

乐视云:http://www.letvcloud.com/

遨游讯海:http://www.573v.cn/

图片云

又拍云:https://www.upyun.com/index.html

得图云:http://www.detuyun.com/

七牛云存储:http://www.qiniu.com/

营销推广

广告平台

酷果广告平台:http://www.kuguopush.com/

有米广告:http://www.youmi.net/

百度联盟:http://union.baidu.com/

多盟广告:http://www.domob.cn/

点睛广告平台:http://mjoy.91.com/

渠道市场

N多网:http://www.nduoa.com/developer

魅族开发者中心:http://developer.meizu.com/

阿里云开发者市场:http://appdev.yunos.com/

中国移动应用商店:http://mm.10086.cn/

渠道聚合

AnySDK:http://www.anysdk.com/

棱镜SDK:http://www.ljsdk.com/

易接SDK:http://www.1sdk.cn/

云接入:http://www.allsdk.co/

OkSDK:http://www.oksdk.com/

营销平台

360点睛营销平台:http://e.360.cn/

天地新道:http://www.tiandixindao.com/

百度网盟:http://wangmeng.baidu.com/

一米线下渠道推广:http://www.yimipingtai.cn/

百度推广:http://e.baidu.com/

创作平台

站内应用

淘宝卖家服务:http://fuwu.taobao.com/

全球速卖通开放平台:http://seller.aliexpress.com/open_platform/index.h

当当网开放平台:http://open.dangdang.com/

拍拍开放平台:http://pop.paipai.com/index

Source: xundaoinfo

常用前端库国内免费CDN

  • bootstrap中国
  • http://www.bootcdn.cn/
  • 360
  • http://libs.useso.com/
  • 七牛
  • http://www.staticfile.org/
  • 又拍云存储
  • http://jscdn.upai.com/
  • 百度
  • http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs
  • 新浪
  • http://lib.sinaapp.com/
  • cdnjs
  • http://www.cdnjs.com/

Source: xundaoinfo

rust项目编译错误

一年之前写了一个蜘蛛来熟悉rust语言。当时rust刚1.0,现在已经1.9了,想再看看api是否稳定,成熟项目是否多了。
看官网,好像文档也多了不少,于是打算完善一下。先看看能不能编译。发现编译不对,提示solicit编译不过,看依赖没有solicit。于是去找是哪个依赖的依赖里有solicit。发现都没有。
cargo clean之后还是如此,但是solicit是一个http client,有关系的只能是hyper了。但是hyper的github上代码没有依赖solicit。下了一个编译,发现也没编译solicit。
偶然点开Cargo.lock一看,发现hyper有依赖solicit,但是估计是之前版本的,删除lock文件之后,这里算是过了。不过看提示还是有solicit,只是版本不同了。
提示url库的UrlParser调用错误,看来剩下的都是常规api变动错误了。。。

Source: xundaoinfo

PHP windows下编译参数

configure –disable-all –enable-cgi –with-analyzer –enable-cli –enable-cli-win32 –enable-embed –with-bz2 –with-curl –enable-sockets –with-sqlite3 –without-gd –with-gmp –enable-mbstring –enable-mbregex –with-mcrypt –with-openssl –enable-zephir_parser –enable-odbc –enable-sysvshm –with-tidy –with-mysqli –with-pdo-mssql –with-pdo-mysql –with-pdo-odbc –with-pdo-pgsql –with-pdo-sqlite –with-pdo-sqlite-external –enable-phar-native-ssl –with-xsl –enable-pdo –with-mysqlnd –enable-opcache

Source: xundaoinfo

rsync配置

      > [root@localhost ~]# yum install rsync
      > [root@localhost ~]# mkdir /etc/rsyncd         #创建配置目录
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.conf              #创建主配置文件
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.secrets          #创建用户密码文件
      > [root@localhost ~]# chmod 600 /etc/rsyncd/rsyncd.secrets  #用户密码文件权限设置
      > [root@localhost ~]# touch /etc/rsyncd/rsyncd.motd            #服务器欢迎信息
      > root@localhost ~]# vim /etc/rsyncd/rsyncd.conf 
      > # Minimal configuration file for rsync daemon 
      > # See rsync(1) and rsyncd.conf(5) man pages for help
      > # This line is required by the /etc/init.d/rsyncd script 
      > pid file = /var/run/rsyncd.pid 
      > port = 873   ##监听端口 
      > address = 192.168.1.1  ##监听地址 
      > #uid = nobody 
      > #gid = nobody   
      > uid = root 
      > gid = root
      > use chroot = yes   ##是否限制在指定目录,为了安装,一般需要启用 
      > read only = no
      > #limit access to private LANs 
      > hosts allow=192.168.1.0/255.255.255.0   ##允许网段 
      > hosts deny=*
      > max connections = 5 
      > motd file = /etc/rsyncd/rsyncd.motd
      > #This will give you a separate log file 
      > #log file = /var/log/rsync.log
      > #This will log every file transferred - up to 85,000+ per user, per sync 
      > #transfer logging = yes
      > log format = %t %a %m %f %b 
      > syslog facility = local3 
      > timeout = 300
      > ##定义一个同步目录
      > [webhome] 
      > path = /data
      > list=yes 
      > ignore errors 
      > auth users = nobody 
      > secrets file = /etc/rsyncd/rsyncd.secrets  ##指定上述账号密码文件 
      > comment = web home
      > exclude =   /web/   ##排除目录
      > 编辑/etc/rsyncd/rsyncd.secrets文件:
      > #Account and password 
      > apache:password123
      > 注意:这里账号虽然用的是系统账号,但是密码是自定义的密码。
      > 
      > 启动使rsync生效:
      > [root@localhost ~]# /usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf 
      > 
      > 设置为开机启动:
      > [root@localhost ~]# echo "/usr/bin/rsync --deamon --config=/etc/rsyncd/rsyncd.conf" >> /etc/rc.d/rc.local 



      > 客户端安装同上,额外只需配置一个密码文件,具体如下:
      > 
      > 
      > [root@localhost ~]# mkdir /etc/rsyncd
      > [root@localhost ~]# echo "password123" > /etc/rsyncd/rsyncd.password   #创建密码文件,密码为服务器端rsyncd.secrets文件中的密码。
      > [root@localhost ~]# chmod 600 /etc/rsyncd/rsyncd.password#一定是只读的,
      > 同步:
      > [root@localhost ~]# rsync -avzP --password-file=/etc/rsyncd/rsyncd.password apache@192.168.1.1::webhome  /var/www/html/

Source: xundaoinfo

php的tcc扩展

最近学习编译器的实现,看到tcc。觉得不错,因为可以编译之后获得函数指针调用。想着能不能实现成一个PHP扩展。动态编译代码并提供给php代码调用,这样对于web可能意义并不大,但是常驻的程序却很有意义。尤其一些简单而重复或者多变的东西,做成扩展虽然可以提升,但相对来说过于麻烦并且不灵活。而这种形式就方便很多了。

花了2天时间,同时熟悉了下好久没写过的php扩展API。写了个简单原型出来了,只支持long float和char*,并且有些内存释放的地方还没处理。只是想做个原型看看效果。

调试了几小时,跑通了之后测试了下。

第一个是php 5.6.5,第二个是使用tcc扩展,加载so和编译时间算在里面了。第三个是想到刚编译了php 7的git最新版,就正好拿来对比下,用的就是php的测试代码。

 php 37014178 cost:1.3031008243561
 c   37014178 cost:0.030487060546875
 php 37014178 cost:0.67009902000427

调用c版本快了很多,但php7的也非常快。之前测试的并没有那么明显的优势。现在明显快了一倍。

tcc嵌入

最近看编译器实现的时候,在github上查tcc,找到一个luajit tcc的项目,是用luajit的ffi来封装的libtcc的库。发现libtcc有些东西非常不错,比如可以编译一段c代码然后生成可执行文件或者调用。于是看了下tcc,api很简单和清晰。于是用c试了下。

#include "libtcc/libtcc.h"
#include <stdio.h>
#include <stdlib.h>

typedef int (*func)(int a,int b);

char *source = "int add(int a,int b){return a+b;}";

int main(int argc,char **argv){
    TCCState *tcc = tcc_new();
    func f = NULL;
    int a = 0;
    tcc_add_library_path(tcc, "./lib");
    tcc_add_library(tcc, "tcc1");
    tcc_set_output_type(tcc, TCC_OUTPUT_MEMORY);
    if(tcc_compile_string(tcc,source) == -1){
        printf("compile string error.\n");
    }
    if(tcc_relocate(tcc,TCC_RELOCATE_AUTO) == -1){
        printf("relocate error.\n");
    }

    f = (func)tcc_get_symbol(tcc, "add");
    a = f(1,2);
    printf("1+2=%d.\n",a);
    tcc_delete(tcc);
    return 0;
}

开始编译过了一直报错,发现是缺tcc_relocate,在getsymbol之前必须调用这个去分配内存。但是加上去之后还是报错,发现少了tcc_set_output_type,但这个注释里写默认就是TCC_OUTPUT_MEMORY选项啊。。。开始没加tcc_add_library_path会提示缺少libtcc1.a。

C11标准

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。相比C99,C11有哪些变化呢——

1、 对齐处理

alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容。

2、 _Noreturn

_Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的attribute((noreturn)),后者在声明语句尾部。

3、 _Generic

_Generic支持轻量级范型编程,可以把一组具有不同类型而却有相同功能的函数抽象为一个接口。

4、 _Static_assert()

_Static_assert(),静态断言,在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式,而普通的assert()在运行时刻断言。

5、安全版本的几个函数

gets_s()取代了gets(),原因是后者这个I/O函数的实际缓冲区大小不确定,以至于发生常见的缓冲区溢出攻击,类似的函数还有其它的。

6、 fopen()新模式

fopen()增加了新的创建、打开模式“x”,在文件锁中比较常用。

7、 匿名结构体、联合体。

8、 多线程

头文件<threads.h>定义了创建和管理线程的函数,新的存储类修饰符_Thread_local限定了变量不能在多线程之间共享。

9、 _Atomic类型修饰符和头文件<stdatomic.h>。

10、改进的Unicode支持和头文件<uchar.h>。

11、quick_exit()

又一种终止程序的方式,当exit()失败时用以终止程序。

12、复数宏,浮点数宏。

13、time.h新增timespec结构体,时间单位为纳秒,原来的timeval结构体时间单位为毫秒。

Source: xundaoinfo