使用shadowsocks代理访问google网站

2017年6月14日 评论已被关闭

1.需要原料如下:

a.windows系统+浏览器

b.Shadowsocks2.5.1代理软件

c.Shadowsocks代理账号

2.步骤

a.下载Shadowsocks软件

b.解压并运行Shadowsocks2.5.1.exe

填入相应的”oversea.codeman.net”,”10036″,””,确定

c.在右小角的小飞机上右键启用系统代理即可

d.google it.

分类: 翻译 标签:

使用Visual Studio2015调试云主机PHP代码

2017年4月23日 评论已被关闭

以下要用到的所有软件都可以在下面的地址(仅办公网访问)下载得到。

http://xesoa.com/app/vs2015

http://xesoa.com/app/ssh

 

调试流程

  1. 安装visual studio 2015

下载并安装:http://xesoa.com/app/vs2015/vs2015.pro_chs.iso

步骤略

 

  1. 安装1.23.9750

下载并安装:http://xesoa.com/app/vs2015/va_x_2073_setup.zip

步骤略

 

  1. 配置云主机

3.1配置xdebug

3.2 php.ini配置如下

  1. 配置ssh(以exe为例)

这里要做一个说明:如果在云主机上开发,因为云主机是无法连接到办公区域的。所以要做一下隧道转发。对ssh感兴趣的可以参考:http://www.ietf.org/rfc/rfc4251.txt

如果对转发原理不感兴趣可直接跳到操作步骤

ssh转发包括两个正向转发和反向转发,动态转发(略)。

 

正向转发例子:

凡是发往本机9000端口的都能过ssh.xesoa.com主机的22端口转发给www.163.com:80,这就实现了一个简单的正向代理请求。注意:localhost在本机解析,www.163.com在ssh.xesoa.com上解析。

反向转发的例子:

凡是到达ssh.xesoa.com主机端口11011的数据都通过ssh.xesoa.com的10026端口转发到主机是10.99.1.11的22端口上。注意:*代表主机ssh.xesoa.com上的任意IP地址。

因为云主机(10.99.1.124)无法连接上办公区域(172.88.1.126),所以无法正向发给办公区域,所以可以在通过反向转发在172.88.1.126上运行:

所有到达10.99.1.124的9000端口的数据都通10.99.1.124的22端口转发到172.88.1.126的9000端口上。调试过程变成下面过程:

操作步骤:

4.1下载plink, windows下ssh的一个实现。

http://xesoa.com/app/ssh/putty/plink.exe

4.2 在cmd里执行

正常连接到远程云主机可以看一下,出现9000端口表示转发绑定成功。

(备注可以把它做成一个开机启动项。)

  1. 配置vs2015

在这里要说明的是:所有的代码操作(svn提交下载)都在本地,不应该在云主机修改php,所有在本地的修改应该即时的同步到云主机上。

  • 新建php工程

指定根目录,这个目录将会与云主机同步。

设置云主机同步目录。项目->属性

Site path是指网站的根目录,每次调试会将本地同步到该目录。

点击publish发布到云主机上。

  • 发布代码

在你修改的文件上右键publish就可以将修改推送到云主机上。

  • 设置断点

在你需要的地方,设置断点,使用F9。

 

  1. 开始调试

按下F5就可以开始调试,如果运行到断点,程序会自己停下来检查。

在浏览器或者postman就可以调试我们的代码,大致窗口如下。

快捷键:

F9设置/取消断点

F10下一步

F11进行函数

F12 转到函数定义

Shift+F9,查看变量值

Ctrl+F5停止运行和调试

 

 

 

 

分类: 翻译 标签:

Nginx使用instance标记处理kqueue/epoll中的stale事件

2015年8月28日 评论已被关闭

下面以epoll为例:

每个fd往往会关联一个自定义的结构体来表示逻辑上的连接。比如在nginx中每个ngx_connection_t都抽象成一个TCP连接并且与fd关联。

当我们accept到一个连接的时候,我们会申请这样一个ngx_connection_t,随后将这个fd与ngx_connection_t关联并加入到epoll循环。

代码(添加读事件)

然后我们使用epoll_wait来检查发生的事件

每个epoll_event的data.ptr是由ngx_connection_t*指针与instance相或而来,也就是data.ptr = c | instance;这样做是有前提条件的,那就是c必须是偶数,因为instance是bool类型,data.ptr最末位存储了instance的值。

 

假设当某一次epoll_wait后返回了一组epoll_event。

随后进行了如下操作:如图1所示:

(1)fd=47的文件描述有事件发生。

(2)处理fd=47时,我们关闭了fd=12的连接,回收了ngx_connection_t内存。

(3)接着处理fd=12时,此时data_ptr指向的ngx_connection_t已经被销毁,访问data_ptr将出现致命错误。

20150828160701

解决方法(如图2所示):暂不回收ngx_connection_t内存而是将ngx_connection_t的fd设置为-1,那么处理fd=12时,发现ngx_connection_t中的fd=-1,那么足以证明这个fd在之前已经被释放掉了,从面阻止使用data_ptr继续使用,这就是stale事件。

20150828160702

 

当我们将fd=12的ngx_connection_t回收后将fd设成了-1,防止处理到fd=12时使用了被释放的data_ptr。

试想一下,此时将fd设置成了-1,但在处理fd=12前,我将刚才释放的ngx_connection_t重新分配给了新连接fd=48(调用了accept()),那么在处理fd=12时,其data_ptr仍然不能使用,因这个ngx_connection_t已不属于fd=12而是属于fd=48,也就是说fd=12的ngx_connection_t已被释放并被fd=48使用。

我们使用instance来区分这个ngx_connection_t到底属于谁。因为本身data_ptr中存储了instance值,并且ngx_connection_t中也存储了instance值,在申请ngx_connection_t时,我们要将ngx_connection_t中的instance值置反。当ngx_connection_t的instance与data_ptr不一致时,说明当前fd已销毁。(如图3所示)

20150828160703

 

注意

另外,有一点要说明的是,如果在处理fd=12之前,fd=48也被销毁了,然后该ngx_connection_t又被fd=49复用,那么这种情况仍然会有问题。

这会导致data_ptr中的instance值与ngx_connection_t一致(两次置反)并且fd=49。event_list原本指示的fd=12有事件,但被nginx错误地认为了fd=49有事件发生,目前我还没想到好的解决办法。

分类: C/C++, Linux, Nginx 标签:

nginx的模块上下文

2015年4月26日 评论已被关闭

ngx_modules数组定义:

初始化完成: 阅读全文…

分类: Nginx 标签:

nginx中定时器与事件流程

2015年4月13日 评论已被关闭

1.nginx中的时间更新

Nginx在内部自己缓存时间,那么这些时间值在什么地方更新呢?

1.1 收到信号时更新时间

1.2 timer_resolution值为0

如果用户没有设置timer_resolution值或者设置为0值,那么每次在轮询事件都会设置NGX_UPDATE_TIME标志,表示轮询结束后要更新时间(以kqueue为例):

轮询时:

1.3 timer_resolution值非0

如果用户设置timer_resolution为非零值,nginx会在定时器触发时更新时间。

在nginx中系统定时器的具体实现有两种,一种是使用setitimer(),另外一种具体事件中模型实现的。

1.3.1使用setitimer()

在事件初始化后使用setitimer(timer_resolution),那么系统会每隔timer_resolution(单位为毫秒)发送SIGALARM信号,信号处理函数:

后续的的轮询会被打断并在结束后会去判断ngx_event_timer_alarm值,如果为1的话会更新时间(以kqueue为例):

1.3.2使用特定的事件模型

对于特定的事件模型,在这里只包括kqueue和eventport。它们内部实现了一个定时器,我们在事件初始化时安装定时器,例如(以kqueue为例):

同时设置还会置上NGX_USE_TIMER_EVENT标志,并且定时器触发时没有回调函数,我们要在事件轮询后判断是否是定时器事件,如果是则要更新时间(以kqueue为例):

 

总结:nginx自身缓存时间。 阅读全文…

分类: Linux, Nginx 标签:

二叉树的深度优先遍历与广度优先遍历

2014年11月22日 评论已被关闭

二叉树的深度优先遍历就是二叉树地前序遍历.二叉树的广度遍历就是层序遍历.(最后面有完整的代码).
一.深度优先遍历(DFS)

深度优先遍历与前序遍历的结果是一样的.那么递归实现应该是

与之对应的非递归算法是,使用栈的先进后出的特性.

二.广度优先遍历(BFS)

二叉树的广度优先遍历其实很简单,大概的思路是访问一个结点时,将它的子结点放入队列后面,当本层访问结束后,队列中就剩下下一层的所有结点,直到队列中没有结点为止.
可以看到队列的前部是当前层剩下的结点,队列的后部是当前层已经访问过的结点的子结点.

完整代码 阅读全文…

分类: 算法导论 标签:

Win32选择保存文件路径和打开文件夹的函数

2014年9月30日 评论已被关闭

有时候我们需要拾取打开或者保存的路径,浏览文件夹,下面是win32的接口。

MSDN:GetSaveFileName
MSDN:SHBrowseForFolder

分类: Win32 标签:

rtmp直播流程

2014年6月24日 评论已被关闭

下面是通过RTMP抓包所得,左侧是客户端Flash Media Live Encoder,右侧是服务器Flash Media Server

 

分类: C/C++, Linux 标签:

两种RTMP的握手协议

2014年6月16日 评论已被关闭

RTMP握手协议

根据RTMP的文档,RTMP的握手过程为:

下面是握手的数据格式:

其中:
时间1:C发送C1时,C上的时间
时间2:S发送S1时,S上的时间
时间3:S接到C1时,S上的时间
时间4:C接到S1时,S上的时间
(时间2和时间3可能相等)

所以上面的过程写成代码应该是: 阅读全文…

分类: 翻译 标签:

Adobe的实时消息协议(RTMP)(翻译)

2014年4月20日 评论已被关闭

本文是对RTMP协议的中文翻译
TXT:rtmp_utf8
HTML:rtmp.html
DOC:rtmp.doc
PDF:rtmp.pdf
原版地址:rtmp_specification_1.0

分类: 翻译 标签: