<?xml version="1.0" encoding="utf-8" ?>


<feed xmlns="http://www.w3.org/2005/Atom">
  <title>天涼好個秋.</title>

  <description>HIWIFI，Openwrt，极路由，飞鸟集，喜折腾，爱思考，记录交流于积累。</description>

  <link href="http://stray.love/"></link>

  <link ref="self" href="http://stray.love/feed"></link>

  <id>f452e3a6af46e7008ad61404df24761a852d2ed1-stray.bitcron.com</id>


  <updated>2018-12-18T04:44:00Z</updated>


  <entry>


    <title>为  Aria2 添加 Tracker 服务器</title>

    <link href="http://stray.love/itshou-zha/wei-aria2-tian-jia-tracker-fu-wu-qi"  rel="alternate"></link>

    <updated>2018-12-18T04:44:00Z</updated>
    <id>itshou-zha/wei-aria2-tian-jia-tracker-fu-wu-qi</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h2 id="toc_1" class="h16"&gt;BitTorrent tracker&lt;/h2&gt;&lt;blockquote class="blockquote_lines_2"&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;&lt;strong&gt;BitTorrent tracker&lt;/strong&gt;（中文可称：&lt;strong&gt;BT服务器&lt;/strong&gt;、&lt;strong&gt;tracker服务器&lt;/strong&gt;等）是帮助BitTorrent协议在节点与节点之间做连接的服务器&lt;/span&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;BitTorrent客户端下载一开始就要连接到tracker，从tracker获得其他客户端IP地址后，才能连接到其他客户端下载。在传输过程中，也会一直与tracker通信，上传自己的信息，获取其它客户端的信息。&lt;/span&gt;
&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;所以说想使用 Aria2 下载 BT 资源，Tracker 是必不可少的。当然 你会说，我从没添加过 Tracker 服务器， Aria2 也照样能用啊！那是因为 Aria2 也支持分布式的 DHT 网络，没有 Tracker 时就靠它了。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_2" class="h16"&gt;trackerslist&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;&lt;strong&gt;&lt;a class="md_compiled" href="https://github.com/ngosang/trackerslist"&gt;trackerslist&lt;/a&gt;&lt;/strong&gt; 是一个开源项目，每天更新 Trackers list，比如下面的 best list&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# https://github.com/ngosang/trackerslist/raw/master/trackers_best.txt&lt;/span&gt;

udp://tracker.coppersurfer.tk:6969/announce
http://tracker.internetwarriors.net:1337/announce
udp://tracker.opentrackr.org:1337/announce
udp://9.rarbg.to:2710/announce
udp://exodus.desync.com:6969/announce
udp://explodie.org:6969/announce
http://tracker1.itzmx.com:8080/announce
udp://thetracker.org:80/announce
udp://ipv4.tracker.harry.lu:80/announce
udp://denis.stalker.upeer.me:6969/announce
udp://tracker.torrent.eu.org:451/announce
udp://tracker.tiny-vps.com:6969/announce
udp://tracker.port443.xyz:6969/announce
udp://open.demonii.si:1337/announce
udp://bt.xxx-tracker.com:2710/announce
udp://retracker.lanta-net.ru:2710/announce
udp://open.stealth.si:80/announce
http://open.acgnxtracker.com:80/announce
udp://tracker.vanitycore.co:6969/announce
udp://tracker.iamhansen.xyz:2000/announce
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;只要将他们添加到 Aria2 的配置文件中，理论上能大幅提高 Aria2 下载 BT 的速度。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_3" class="h16"&gt;Aria2 的配置文件&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;参考 Aria2 的官方文档 ，&lt;code&gt;https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-bt-tracker&lt;/code&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;配置类似于：&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_conf"&gt;&lt;code&gt;bt-tracker=udp://tracker.coppersurfer.tk:6969/announce,http://tracker.internetwarriors.net:1337/announce,udp://tracker.opentrackr.org:1337/announce&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;添加到 Aria2 的配置文件，重启 Aria2 即可生效。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_4" class="h16"&gt;省力的方法&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;上面的教程很详细了，但每次都自己来修改肯定会累死人，你可以使用脚本替你完成上面的工作，可以参考小众软件的这篇文章下的评论:&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_start md_line_end"&gt;&lt;a class="md_compiled" href="https://www.appinn.com/ara2-add-trackers-list-for-speed-up/"&gt;https://www.appinn.com/ara2-add-trackers-list-for-speed-up/&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;记得重启 Aria2。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_5" class="h16"&gt;这样就完了吗？&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;懒人自然需要更省力的手段。Aria2 是支持 RPC 的，类似与 AriaNG 等 WEB UI 都是靠 RPC 和 Aria2 通信的，那么我们也是可以写个脚本用 RPC 来设置 Aria2 ，并且实时生效，无需重启 Aria2。&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;#more trackers list, see https://github.com/ngosang/trackerslist&lt;/span&gt;

&lt;span class="nv"&gt;tracker_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all.txt&amp;#39;&lt;/span&gt;
&lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://10.10.10.5:6800/jsonrpc&amp;#39;&lt;/span&gt;
&lt;span class="nv"&gt;passwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xxxxxx&amp;#39;&lt;/span&gt;

&lt;span class="nv"&gt;tracker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -n  &lt;span class="k"&gt;$(&lt;/span&gt;curl -s -L &lt;span class="nv"&gt;$tracker_url&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;N;s/\n//g&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$tracker&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nv"&gt;$path&lt;/span&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;quot;jsonrpc&amp;quot;:&amp;quot;2.0&amp;quot;,&amp;quot;method&amp;quot;:&amp;quot;aria2.changeGlobalOption&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;cron&amp;quot;,&amp;quot;params&amp;quot;:[&amp;quot;token:&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$passwd&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;,{&amp;quot;bt-tracker&amp;quot;:&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$tracker&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;quot;}]}&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;在定时任务中定时执行上面的脚本就万事大吉了。定时任务不在本文的范畴里了蛤，Google 一下就有了。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;修改 tracker_url、path 和 passwd 三个变量，脚本就可以为你工作了。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_6" class="h16"&gt;完&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;很早之前就在 NAS 里使用这个脚本来更新 trackerslist 了，直到昨天，在 twitter 上看到小青蛙（小众软件的作者）分享了文章，才想到把我自己的方式记录一下。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;很久没写博客了，最近有些忙。&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>极路由 KoolProxy 本地插件</title>

    <link href="http://stray.love/hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian"  rel="alternate"></link>

    <updated>2018-12-13T07:59:29Z</updated>
    <id>hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h2 id="toc_1" class="h16"&gt;填坑&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;很久之前（半年了）答应了很多朋友要做一个本地版本的 kp 插件，经过端午节三天的努力，现在终于把坑填上了。而且也支持 HTTPS 了。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_2" class="h16"&gt;说明&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;插件 UI 和 iptables 规则移植自 koolshare F大（fw867）维护的 lede-x64 软件中心中的 koolproxy 插件，取得了 houzi 和 Carseason 大佬的同意。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_3" class="h16"&gt;界面&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;简单放两张图&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/plugin_home.jpg" alt="" title="" &gt;&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image img_before only_img_before md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/kp_main.jpg" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_4" class="h16"&gt;改动日志&lt;/h2&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;0.1.8: 重构插件。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;0.2.0: 


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;修复无法开机启动的问题。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;更新过滤引擎和规则到最新版。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;修复其他BUG
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;0.2.3: 


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;修复 BUG。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;更新过滤引擎和规则到最新版。
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="toc_5" class="h16"&gt;to-do&lt;/h2&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;多端口控制
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;证书备份 &amp;amp;&amp;amp; 恢复
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;UI 适配手机
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="toc_6" class="h16"&gt;下载&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_start"&gt;&lt;a class="md_compiled" href="https://cdn.stray.love//hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/%E8%BF%87%E6%BB%A4%E5%B9%BF%E5%91%8A_%E6%9C%AC%E5%9C%B0-koolproxy-0.1.8.hipk"&gt;koolproxy-0.1.8.hipk&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed"&gt;&lt;a class="md_compiled" href="https://cdn.stray.love/hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/koolproxy-2.0.hipk"&gt;koolproxy-0.2.0.hipk&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_end"&gt;&lt;a class="md_compiled" href="https://cdn.stray.love/hiwifi/ji-lu-you-koolproxy-ben-di-ban-cha-jian/koolproxy-2.3.hipk"&gt;koolproxy-0.2.3.hipk&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>第几个 Hello World</title>

    <link href="http://stray.love/itshou-zha/helloworld-n"  rel="alternate"></link>

    <updated>2018-08-06T03:27:05Z</updated>
    <id>itshou-zha/helloworld-n</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h2 id="toc_1" class="h16"&gt;Hello World 情怀&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;每个人初学代码时肯定都写过 Hello World, 每一次接触一门新的技术&amp;amp;编程语言，都会用新语言写一个Hello World 程序，最近在看《Beej&amp;#39;s Guide to Network Programming》,突发奇想又写了一个 Hello World&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_2" class="h16"&gt;code&lt;/h2&gt;&lt;div class="codehilite code_lang_c  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;sys/wait.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;netdb.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="cp"&gt;#define PORT &amp;quot;5964&amp;quot;&lt;/span&gt;
&lt;span class="cp"&gt;#define BACKLOG 10&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;HTTP/1.1 200 OK&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Server: MarIxs&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Content-length: 13&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;Content-Type: text/html&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s"&gt;Hello, World!!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sigchld_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waitpid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WNOHANG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//等效于 wait&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;get_in_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sa_family&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in6&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sin6_addr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;addrinfo&lt;/span&gt; &lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;servinfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_storage&lt;/span&gt; &lt;span class="n"&gt;their_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;sin_size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sigaction&lt;/span&gt; &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INET6_ADDRSTRLEN&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt; &lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ai_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_UNSPEC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ai_socktype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ai_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AI_PASSIVE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getaddrinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;hints&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;servinfo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;getaddrinfo: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gai_strerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;servinfo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;servinfo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_next&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_family&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_socktype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_protocol&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server:port&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setsockopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOL_SOCKET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SO_REUSEADDR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;setsockopt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ai_addrlen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server:bind&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;server:failed to bind&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;freeaddrinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;servinfo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BACKLOG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server:listen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sa_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sigchld_handler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;sigemptyset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sa_mask&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sa_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SA_RESTART&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sigaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SIGCHLD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sigaction&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server:waiting for connections... &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sin_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt; &lt;span class="n"&gt;their_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;their_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sin_size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server:accept&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;inet_ntop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;their_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ss_family&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_in_addr&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;their_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;server: got connection from %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        
            &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;send&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h2 id="toc_3" class="h16"&gt;验证&lt;/h2&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@NL:~# curl http://127.0.0.1:5964 
Hello, World!
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;在浏览器里打开 ip:5964 就会显示 Hello, World!&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_4" class="h16"&gt;后&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;中间加上逗号： Hello, world! 才是正确的写法哦。&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>OpenWrt jsonfilter</title>

    <link href="http://stray.love/itshou-zha/jsonfiler"  rel="alternate"></link>

    <updated>2018-07-17T10:09:08Z</updated>
    <id>itshou-zha/jsonfiler</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h2 id="toc_1" class="h16"&gt;Info&lt;/h2&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# opkg files jsonfilter
Package jsonfilter &lt;span class="o"&gt;(&lt;/span&gt;2018-02-04-c7e938d6-1&lt;span class="o"&gt;)&lt;/span&gt; is installed on root and has the following files:
/usr/bin/jsonfilter
root@Openwrt:~# opkg info jsonfilter
Package: jsonfilter
Version: 2018-02-04-c7e938d6-1
Depends: libc, libubox, libjson-c
Status: install user installed
Architecture: x86_64
Installed-Time: 1528614208
root@Openwrt:~# &lt;span class="nv"&gt;jsonfilter&lt;/span&gt;
&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;Usage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;
  &lt;span class="c1"&gt;# jsonfilter [-a] [-i &amp;lt;file&amp;gt; | -s &amp;quot;json...&amp;quot;] {-t &amp;lt;pattern&amp;gt; | -e &amp;lt;pattern&amp;gt;}&lt;/span&gt;
  -q            Quiet, no errors are printed
  -h, --help    Print this &lt;span class="nb"&gt;help&lt;/span&gt;
  -a            Implicitely treat input as array, useful &lt;span class="k"&gt;for&lt;/span&gt; JSON logs
  -i path       Specify a JSON file to parse
  -s &lt;span class="s2"&gt;&amp;quot;json&amp;quot;&lt;/span&gt;     Specify a JSON string to parse
  -l limit      Specify max number of results to show
  -F separator  Specify a field separator when using &lt;span class="nb"&gt;export&lt;/span&gt;
  -t &amp;lt;pattern&amp;gt;  Print the &lt;span class="nb"&gt;type&lt;/span&gt; of values matched by pattern
  -e &amp;lt;pattern&amp;gt;  Print the values matched by pattern
  -e &lt;span class="nv"&gt;VAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;pat&amp;gt;  Serialize matched value &lt;span class="k"&gt;for&lt;/span&gt; shell &lt;span class="s2"&gt;&amp;quot;eval&amp;quot;&lt;/span&gt;

&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;Patterns&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;

  Patterns are JsonPath: http://goessner.net/articles/JsonPath/
  This tool implements $, @, &lt;span class="o"&gt;[]&lt;/span&gt;, * and the union operator &lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;
  plus the usual expressions and literals.
  It does not support the recursive child search operator &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt; or
  the &lt;span class="s1"&gt;&amp;#39;?()&amp;#39;&lt;/span&gt; and &lt;span class="s1"&gt;&amp;#39;()&amp;#39;&lt;/span&gt; filter expressions as those would require a
  &lt;span class="nb"&gt;complete&lt;/span&gt; JavaScript engine to support them.

&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;Examples&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;

  Display the first IPv4 address on lan:
  &lt;span class="c1"&gt;# ifstatus lan | jsonfilter -e &amp;#39;@[&amp;quot;ipv4-address&amp;quot;][0].address&amp;#39;&lt;/span&gt;

  Extract the release string from the board information:
  &lt;span class="c1"&gt;# ubus call system board | jsonfilter -e &amp;#39;@.release.description&amp;#39;&lt;/span&gt;

  Find all interfaces which are up:
  &lt;span class="c1"&gt;# ubus call network.interface dump | \&lt;/span&gt;
        jsonfilter -e &lt;span class="s1"&gt;&amp;#39;@.interface[@.up=true].interface&amp;#39;&lt;/span&gt;

  Export br-lan traffic counters &lt;span class="k"&gt;for&lt;/span&gt; shell eval:
  &lt;span class="c1"&gt;# devstatus br-lan | jsonfilter -e &amp;#39;RX=@.statistics.rx_bytes&amp;#39; \&lt;/span&gt;
        -e &lt;span class="s1"&gt;&amp;#39;TX=@.statistics.tx_bytes&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h2 id="toc_2" class="h16"&gt;Some example&lt;/h2&gt;&lt;h3 id="toc_3" class="h16"&gt;Option -a&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jsonfilter -a -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;$&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; 1, 2, 3, &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_4" class="h16"&gt;Option -i&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;quot;a&amp;quot;:1,&amp;quot;b&amp;quot;:2}&amp;#39;&lt;/span&gt; &amp;gt; /tmp/test.json&lt;span class="p"&gt;;&lt;/span&gt;jsonfilter -i /tmp/test.json -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;$&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;: 1, &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;: &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_5" class="h16"&gt;Option -s&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# jsonfilter -s &lt;span class="s1"&gt;&amp;#39;{&amp;quot;a&amp;quot;:1,&amp;quot;b&amp;quot;:2}&amp;#39;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;$&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;: 1, &lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;: &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_6" class="h16"&gt;Get Bing pic url from api&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# curl -k &lt;span class="s1"&gt;&amp;#39;http://www.bing.com/HPImageArchive.aspx?format=js&amp;amp;idx=0&amp;amp;n=1&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;images&amp;quot;&lt;/span&gt;:&lt;span class="o"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;startdate&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;20180706&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;fullstartdate&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;201807061600&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;enddate&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;20180707&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;/az/hprichbg/rb/Peloton_ZH-CN7472605035_1920x1080.jpg&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;urlbase&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;/az/hprichbg/rb/Peloton_ZH-CN7472605035&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;2016年环法自行车赛中骑在绿树成荫的道路上的选手 (© Michael Steele/Getty Images Sport)&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;copyrightlink&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;http://www.bing.com/search?q=%E7%8E%AF%E6%B3%95%E8%87%AA%E8%A1%8C%E8%BD%A6%E8%B5%9B&amp;amp;form=hpcapt&amp;amp;mkt=zh-cn&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;quiz&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;/search?q=Bing+homepage+quiz&amp;amp;filters=WQOskey:%22HPQuiz_20180706_Peloton%22&amp;amp;FORM=HPQUIZ&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;wp&amp;quot;&lt;/span&gt;:false,&lt;span class="s2"&gt;&amp;quot;hsh&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;f4e4025f39bd7ed187dee34e042e8ee6&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;drk&amp;quot;&lt;/span&gt;:1,&lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;:1,&lt;span class="s2"&gt;&amp;quot;bot&amp;quot;&lt;/span&gt;:1,&lt;span class="s2"&gt;&amp;quot;hs&amp;quot;&lt;/span&gt;:&lt;span class="o"&gt;[]}]&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;tooltips&amp;quot;&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;loading&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;正在加载...&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;previous&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;上一个图像&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;next&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;下一个图像&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;walle&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;此图片不能下载用作壁纸。&amp;quot;&lt;/span&gt;,&lt;span class="s2"&gt;&amp;quot;walls&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;下载今日美图。仅限用作桌面壁纸。&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;
root@Openwrt:~# curl -sk &lt;span class="s1"&gt;&amp;#39;http://www.bing.com/HPImageArchive.aspx?format=js&amp;amp;idx=0&amp;amp;n=1&amp;#39;&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt; jsonfilter -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;$&lt;span class="s2"&gt;.images[0].url&amp;quot;&lt;/span&gt;
/az/hprichbg/rb/Peloton_ZH-CN7472605035_1920x1080.jpg
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_7" class="h16"&gt;which elemnt a&amp;#39;s value is 1 in array&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root@Openwrt:~# jsonfilter -s &lt;span class="s1"&gt;&amp;#39;[{&amp;quot;a&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;b&amp;quot;:100},{&amp;quot;a&amp;quot;:&amp;quot;2&amp;quot;,&amp;quot;b&amp;quot;:200}]&amp;#39;&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;$&lt;span class="s2"&gt;[@.a=&amp;#39;1&amp;#39;]&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;</summary>

  </entry>


  <entry>


    <title>windows进程休眠</title>

    <link href="http://stray.love/wen-ti-jie-jue-fang-an/suspend-processes-on-windows"  rel="alternate"></link>

    <updated>2018-06-28T12:47:23Z</updated>
    <id>wen-ti-jie-jue-fang-an/suspend-processes-on-windows</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h2 id="toc_1" class="h16"&gt;前&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;去年换了入门版的 Surface Book，买了 TF 卡和 Dock，存储容量和接口也都够用，软件上，配合 WSL 能很好的完成日常的工作。作为二合一设备，工作之余随时变成平板电脑，看看新闻听听歌还是很棒的，但尴尬之处在于，之前打开的桌面应用，比如：Chrome 、微信、QQ、IDE 会让平板模式下设备发烫，但还不好关掉，因为休息事件过了还要重新打开。所以才有了接下来的对策。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_2" class="h16"&gt;对策&lt;/h2&gt;&lt;h3 id="toc_3" class="h16"&gt;如果关掉程序麻烦，那干脆想办法 暂停进程？&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;Google 了下，找到了 pssuspend 程序&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_cmd"&gt;&lt;code&gt;C:\Users\MarIxs&amp;gt;pssuspend /h

PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals

PsSuspend suspends or resumes processes on a local or remote NT system.

Usage: pssuspend [-r] [\\RemoteComputer [-u Username [-p Password]]] &amp;lt;process Id or name&amp;gt;
     -r    Resume.
     -u    Specifies optional user name for login to
           remote computer.
     -p    Specifies optional password for user name. If you omit this
           you will be prompted to enter a hidden password.
     -nobanner Do not display the startup banner and copyright message.&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;试用下&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_cmd"&gt;&lt;code&gt;C:\Users\MarIxs&amp;gt;pssuspend qq.exe

PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals

Process qq.exe suspended.&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;QQ确实被暂停了，接下来用 -r 参数恢复。&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_cmd"&gt;&lt;code&gt;C:\Users\MarIxs&amp;gt;pssuspend qq.exe -r

PsSuspend v1.07 - Process Suspender
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals

Process qq.exe resumed.&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;进程被暂停后，cpu 占用会变成 0 ，内存占用并没有被释放（这也是应该的），而且程序本身会变得无响应。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;另一个问题是 pssuspend 每次只能暂停一个进程，感觉效率略低。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_4" class="h16"&gt;再寻找&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;这次不止 Google、还搜了下 GitHub，果然有收获&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_end"&gt;&lt;a class="md_compiled" href="https://github.com/craftwar/suspend"&gt;https://github.com/craftwar/suspend&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_readme"&gt;&lt;code&gt;Usage:

suspend.exe [-n] [-r] [-s] ProcessName1 [ProcessName2] .....

Options
switch can be specified in any postion (first ones are recommended)
-n  no operation mode (for test or whatever)
-r  resume mode
-s  case sensitive (case insensitive if not specified)

ex:
to suspend
suspend.exe a.exe b.exe

to resume
suspend.exe -r a.exe b.exe&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;测试下&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_cmd"&gt;&lt;code&gt;C:\Users\MarIxs&amp;gt;suspend qq.exe chrome.exe
suspended process(es):
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
QQ.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;看样很给力，恢复试试&lt;/span&gt;
&lt;/p&gt;


&lt;pre class="lang_cmd"&gt;&lt;code&gt;C:\Users\MarIxs&amp;gt;suspend qq.exe chrome.exe -r
resumed process(es):
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
QQ.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe
chrome.exe&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;很不错&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_5" class="h16"&gt;边边角角&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;一个进程在暂停时是全屏的，那么暂停后，就再也没办法把它最小化了，所以还需要在暂停前把窗口最小化，为了完成这个操作，我又找到了另一个工具 NirCmd &lt;a class="md_compiled" href="http://nircmd.nirsoft.net"&gt;http://nircmd.nirsoft.net&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;使用 sendkey 发送 win + m 将所有窗口最小化，之后再暂停进程，完美~&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_6" class="h16"&gt;成品&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;配合 Listary&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_end"&gt;&lt;img class="md_compiled " src="https://oartlm8rs.qnssl.com//wen-ti-jie-jue-fang-an/suspend-processes-on-windows/snipaste.jpg" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_7" class="h16"&gt;最后&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;好久没像这样折腾了..&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>ZeroTier 中阶教程</title>

    <link href="http://stray.love/jiao-cheng/zerotier-zhong-jie-jiao-cheng"  rel="alternate"></link>

    <updated>2018-02-22T09:43:00Z</updated>
    <id>jiao-cheng/zerotier-zhong-jie-jiao-cheng</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h1 id="toc_0" class="h16"&gt;前&lt;/h1&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;这篇中阶教程从这个网络拓扑图说起。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/networks.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;本文教大家如何通过 ZeroTier 让拓扑图中的 两台 PC、两台 Router、两台 Server、iPhone 之间可以互相访问。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_1" class="h16"&gt;初阶方案&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;如果读过初阶教程，那一定能想得到最容易的方法：在所有的设备上都安装 Zerotier 就可以实现互相访问的目的。但这也是最麻烦的方法，毕竟要在所有设备上安装 ZeroTier。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_2" class="h16"&gt;正确的做法是什么？&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;只需要在两台 Router上安装 ZeroTier 并正确配置 路由表 和 防火墙 即可。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_3" class="h16"&gt;正式开始&lt;/h2&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;在 Router1 上安装 Zerotier，并填写 network ID 加入 ZeroTier 网络
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;假设 ZeroTier 为 Router1 分配的 IP 为 10.10.10.11 
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;在 ZeroTier 官网设置 Managed Routes 选项 如下图填写：


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/ManagedRoutes.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;点击加号，等待生效。

&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;配置 Router1 的防火墙（以 OPENWRT 路由器为例）


&lt;pre&gt;&lt;code&gt;# 其中 zt0 是 ZeroTier 的物理接口，可以使用  zerotier-cli listnetworks 命令查看，其中 zt0 在其他平台可能是 其他名字
root@LEDE:~# zerotier-cli listnetworks
200 listnetworks &amp;lt;nwid&amp;gt; &amp;lt;name&amp;gt; &amp;lt;mac&amp;gt; &amp;lt;status&amp;gt; &amp;lt;type&amp;gt; &amp;lt;dev&amp;gt; &amp;lt;ZT assigned ips&amp;gt;
200 listnetworks xxxxxxxxx MarIxs xx:xx:xx:xx:xx:xx OK PRIVATE zt0 10.10.10.11/20
#配置防火墙
root@LEDE:~# iptables -I FORWARD -i zt0 -j ACCEPT
root@LEDE:~# iptables -I FORWARD -o zt0 -j ACCEPT
root@LEDE:~# iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;为了测试 iPhone 安装并运行 ZeroTier 并加入 ZeroTier 网络

&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;如此 Router1 下的所有设备和 iPhone 可以互相访问了，也就是说 iPhone、Router1、PC1、Server1 任意两个之间都可以 ping 通。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;比如在 iPhone 上 ping 10.10.10.11（Router1）、192.168.10.1（Router1）、192.168.10.100（PC1）、192.168.10.200（Server1） 都是没问题的。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_4" class="h16"&gt;更进一步&lt;/h2&gt;
&lt;p class="md_block  md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;将 Router2 网络加入 ZeroTier，过程和 Router1 类似。&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;在 Router2 上安装 Zerotier，并填写相同 network ID 加入 ZeroTier 网络
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;假设 ZeroTier 为 Router2 分配的 IP 为 10.10.10.12
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;在 ZeroTier 官网设置 Managed Routes 选项 如下图填写：


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/ManagedRoutes2.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;点击加号，等待生效。

&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;配置 Router2 的防火墙（以 OPENWRT 路由器为例）


&lt;pre&gt;&lt;code&gt;#其中 zt0 是 ZeroTier 的物理接口，可以使用  zerotier-cli listnetworks 命令查看，其中 zt0 在其他平台可能是 其他名字
root@LEDE:~# zerotier-cli listnetworks
200 listnetworks &amp;lt;nwid&amp;gt; &amp;lt;name&amp;gt; &amp;lt;mac&amp;gt; &amp;lt;status&amp;gt; &amp;lt;type&amp;gt; &amp;lt;dev&amp;gt; &amp;lt;ZT assigned ips&amp;gt;
200 listnetworks xxxxxxxxx MarIxs xx:xx:xx:xx:xx:xx OK PRIVATE zt0 10.10.10.12/20
#配置防火墙
root@LEDE:~# iptables -I FORWARD -i zt0 -j ACCEPT
root@LEDE:~# iptables -I FORWARD -o zt0 -j ACCEPT
root@LEDE:~# iptables -t nat -I POSTROUTING -o zt0 -j MASQUERADE&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;至此，拓扑图上的所有设备都可以互相访问了。而 Router1 和 Router2 所在的两个网络被无缝连接在了一起，如果两个网络在异地，那就是所谓的异地组网了。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_5" class="h16"&gt;ZeroTier 的 Managed Routes 功能&lt;/h2&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;按上面教程设置后， Managed Routes 如下图，&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love//jiao-cheng/zerotier-zhong-jie-jiao-cheng/route.png" alt="" title="" &gt;&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line img_before only_img_before md_line_end"&gt;对于熟悉路由表的朋友应该没什么难度，但对于对于网络了解很少的朋友可能会有些困难。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ul"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;这里简单说明下：&lt;/span&gt;
&lt;/p&gt;


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;networks/bits：填写需要被访问的网段
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;（lan）：网络中接入 ZeroTier 的设备被分配的 IP
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ul"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;所以前面的教程例子很容易理解了，以 Router1 为例：&lt;/span&gt;
&lt;/p&gt;


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;需要被访问的是 Router1 下的设备，就是 Router1 的 lan IP 段，拓扑图上可以看出 Router1 lan IP 段为 192.168.10.1/24
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;这部分网络，接入 ZeroTier 的是 Router1 ，被分配的 IP 为 10.10.10.11 
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;所以 networks/bits 为 192.168.10.1/24，（lan）为 10.10.10.11
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;用相同的思路分析 Router2 的网络，也能得到：networks/bits 为 192.168.5.1/24，（lan）为 10.10.10.12&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;ZeroTier 会根据你的设置，自动（智能）下发路由表到设备中，从而实现多个网段互联互通。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;感兴趣的朋友可以按照教程组网，然后查看设备上路由表。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_6" class="h16"&gt;需要注意&lt;/h2&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;&lt;strong&gt;组网的多个局域网，IP 段不能冲突，&lt;/strong&gt;

&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;如拓扑图中 Router1 192.168.10.1/24 和 Router2 192.168.5.1/24 是不冲突的。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;&lt;strong&gt;防火墙的配置可能因设备而异&lt;/strong&gt;

&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;主要的目的是放行 ZeroTier 的数据包和 SNAT 转换。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="toc_7" class="h16"&gt;其他 FAQ&lt;/h2&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;ZeroTier 一定要安装路由器上才能实现组网嘛？


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;不，只要能运行 ZeroTier 的设备加上正确的路由表都可以实现。只是在路由器（网关上）某些配置更加方便。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;只能两个局域网互相访问嘛？


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;当然可以更多
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;延迟如何？


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;实测在 4G 网络下十分不稳定。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;在固网（宽带）的情况下很稳定。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;极路由插件什么时候出？


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;快了快了（拖延症）
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="toc_8" class="h16"&gt;后&lt;/h1&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;春节躺在家中刷推特，无意中发现有朋友分享初级教程到了推特上，倍感荣幸。给大家拜个晚年，新年快乐，狗年大吉~！&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>ZeroTier 初阶教程</title>

    <link href="http://stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng"  rel="alternate"></link>

    <updated>2018-02-03T09:43:00Z</updated>
    <id>jiao-cheng/zerotier-chu-jie-jiao-cheng</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h1 id="toc_0" class="h16"&gt;什么是 ZeroTier&lt;/h1&gt;
&lt;p class="md_block  md_has_block_below md_has_block_below_blockquote"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/zerotier.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;blockquote class="blockquote_lines_1"&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;ZeroTier delivers the capabilities of VPNs, SDN, and SD-WAN with a single system. Manage all your connected resources across both local and wide area networks as if the whole world is a single data center.&lt;/span&gt;
&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;简单来说，ZeroTier 是一款简单易用的，在任何有网络的地方，都可以连回家里、公司、学校，而无需公网 IP 和复杂端口转发配置，基于 p2p 技术的内网穿透工具。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;更形象一点的说法是，ZeroTier 就像虚拟的交换机，所有 ZeroTier 的客户端节点都可以互访互通。&lt;/span&gt;
&lt;/p&gt;

&lt;h2 id="toc_1" class="h16"&gt;ZeroTier 的优势是什么&lt;/h2&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;跨平台。客户端涵盖主流的设备： Windows、MacOS、Linux、iOS、Android、QNAP NAS、Synology NAS、Western Digital MyCloud NAS、Openwrt
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;控制端（ZeroTier 官网）功能足够强大。可以下发路由表、设备准入控制、IP 分配、流量规则等，ZeroTier 会自动下发配置，只需启动客户端即可。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;客户端配置简单。ZeroTier 会自动下发配置，所以只需填入 Network ID 启动 ZeroTier 就可以了，这对于很多智能设备、嵌入式设备很友好。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;可以建立中转服务器（Moon 服务器）。在网络高峰期，或者某些众所周知（qiang）的原因会导致 ZeroTier 官方服务器链接困难，此时可以自己建立 Moon 服务器，从而实现更好的链接效果。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;接近于免费。个人用户最多可以接入 100 节点设备，完全能满足一般人的需求，而在路由表配置得当的情况下，两个节点就可以使两个内网完全互联（异地组网），这样就远不止100 设备那么少了。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;客户端开源。这就意味着在官方不提供客户端的设备上，你完全可以自己编译。
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="toc_2" class="h16"&gt;初阶教程 点对点链接&lt;/h2&gt;&lt;h3 id="toc_3" class="h16"&gt;注册 ZeroTier 账号&lt;/h3&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;访问 ZeroTier 官网 &lt;a href='https://my.zerotier.com/login' target='_blank'&gt;传送门&lt;/a&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;推荐使用 Google 账户快速登陆
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;使用其他注册方式的略过吧，相信你能搞定
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="toc_4" class="h16"&gt;创建 Network&lt;/h3&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;登陆后点击 Networks 选项卡
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block  md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/creat_network_id.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;点击 Creat 创建 Networks
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block  md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/creat_network_id_1.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;点击新创建出的 Networks 进行设置
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/created_network_id.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_5" class="h16"&gt;设置 Network&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;创建好了 Network 后，一般情况下无需设置就可以使用了。着急上手的朋友可以跳过设置这一节，下面介绍一些设置的说明。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block  md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_start"&gt;设置项分四大类，常用其中两项 Settings 和 Members。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/network_setting.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Settings 常用设置项的解释

&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Network ID: 网络 ID ，客户端使用此 ID 加入到网络中
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Name &amp;amp; Description: 设定 Network 的名称和描述，可任意修改
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Access Control: 设定 Network 的类型，其中 Certificate (Private Network) 是私有网络，节点的加入需要审核。None (Public Network) 加入不需要任何审核。推荐选择私有网络
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Multicast Recipient Limit 不用管系列
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Managed Routes: 路由表设置，初阶教程中不需要修改
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;IPv4 Auto-Assign: 节点 IPv4 自动分配，这里只要保证自动分配的网段和节点的 IP 不冲突即可
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;IPv6 Auto-Assign: 节点 IPv6 自动分配，可以忽略
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Members 顾名思义，就是节点状态查看和管理，包括在线状态、准入、拉黑、改名、添加描述、设置静态 IP。
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;嗯~！除了注意分配的 IPv4 不和节点 IP 冲突，基本没有其他的注意项目了。&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_6" class="h16"&gt;客户端使用&lt;/h3&gt;
&lt;p class="md_block  md_has_block_below md_has_block_below_ul"&gt;
    &lt;span class="md_line md_line_start"&gt;这里以 Windows 和 Android 为例，期待的结果是两者可以互相访问。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;客户端下载 &lt;a href='https://www.zerotier.com/download.shtml' target='_blank'&gt;传送门&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Windows 

&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;下载安装，运行 Windows 客户端之后，点击右下角区域的 ZeroTier 图标，选择join network
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/Windows_join.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;输入 Network ID ,然后点击 join&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/Windows_network_id.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;点击右下角的 ZeroTier 图标，选择 show networks&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/deauth_network.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;status 显示为 ACCESS_DENIED，这说明设备没有被准入，去查看 Members 选项，确认设备确实是当前设备后，点击的箭头处准许设备连入。
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;稍等一分钟左右，状态如下图，表示加入成功，此时记住节点的 IP 为 192.168.192.88&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/auth_ok.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Android 注意状态栏，手机全程使用 4G，方便后面测试连通性&lt;br&gt;

&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;下载安装，点开 Android APP，点击右下角的 connect，等待状态显示为 ONLINE 后，点击 右上角加号&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_connected.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;输入 Network ID ,然后点击 join&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_join.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;和 Windows 客户端一样， Members 选项，确认设备确实是当前设备后，准入
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;等待 status 变成ok，记录下 IP 192.168.192.231&lt;br&gt;
&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_ok.png" alt="" title="" &gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="toc_7" class="h16"&gt;连通性测试&lt;/h3&gt;
&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;从 Windows Ping Android 的 IP，延迟有点高，但还是连通的
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block  md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/windows_ping.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;从 Android 访问 Windows 的 IP，可以看到了 Windows 的资源使用情况，说明是连通的&lt;br&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_with_image md_line_start md_line_end"&gt;&lt;img class="md_compiled " src="https://cdn.stray.love/jiao-cheng/zerotier-chu-jie-jiao-cheng/app_test_connect.png" alt="" title="" &gt;&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_8" class="h16"&gt;其他&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;你可能会好奇，在网页中显示 PC 资源占用是怎么做到的，emmm 是用 AIDA64 实现的，用废旧手机做资源监视器，是不是很炫酷
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;关注博客的朋友应该知道，每次发一些新奇东西的教程，就代表着接下来会出插件了。嗯~！是的， ZeroTier 的极路由插件不远了
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;看过初阶教程后，你可能会疑问，每一个设备都必须安装 ZeroTier 才能实现互通？然而这也太麻烦了。嗯 所以叫初阶教程啊，好戏还在后头
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</summary>

  </entry>


  <entry>


    <title>使用公钥登陆OpenWrt</title>

    <link href="http://stray.love/wen-ti-jie-jue-fang-an/shi-yong-gong-yao-deng-lu-openwrt"  rel="alternate"></link>

    <updated>2017-11-30T12:56:40Z</updated>
    <id>wen-ti-jie-jue-fang-an/shi-yong-gong-yao-deng-lu-openwrt</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h3 id="toc_0" class="h16"&gt;前&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;以下操作均在 Bash on windows 下执行。&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_1" class="h16"&gt;生成密钥&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;输入以下命令，输入三次回车，即可得到一对密钥。&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;toor@SurfaceBook:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key &lt;span class="o"&gt;(&lt;/span&gt;/home/toor/.ssh/id_rsa&lt;span class="o"&gt;)&lt;/span&gt;: 
Created directory &lt;span class="s1"&gt;&amp;#39;/home/toor/.ssh&amp;#39;&lt;/span&gt;.
Enter passphrase &lt;span class="o"&gt;(&lt;/span&gt;empty &lt;span class="k"&gt;for&lt;/span&gt; no passphrase&lt;span class="o"&gt;)&lt;/span&gt;: 
Enter same passphrase again: 
Your identification has been saved in /home/toor/.ssh/id_rsa.
Your public key has been saved in /home/toor/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:U2ZM6mqTrxl0e/JWVygB9fw6RXHZBHcinGM7wegMmws 
toor@SurfaceBook
The key&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;s randomart image is:
+---&lt;span class="o"&gt;[&lt;/span&gt;RSA 2048&lt;span class="o"&gt;]&lt;/span&gt;----+
&lt;span class="p"&gt;|&lt;/span&gt;          o*o.o+B&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;        .+. O+ +&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;        .*&lt;span class="o"&gt;=&lt;/span&gt;. &lt;span class="o"&gt;=&lt;/span&gt;o..&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;      E.o+o + .o.&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;      ..S.   o .o&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;     . +.o  . .o &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;      * o .. .o  &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;     . &lt;span class="o"&gt;=&lt;/span&gt; +.    . &lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;|&lt;/span&gt;      o....      &lt;span class="p"&gt;|&lt;/span&gt;
+----&lt;span class="o"&gt;[&lt;/span&gt;SHA256&lt;span class="o"&gt;]&lt;/span&gt;-----+
toor@SurfaceBook:~$ ll .ssh
总用量 4
drwx------ &lt;span class="m"&gt;0&lt;/span&gt; toor toor  &lt;span class="m"&gt;512&lt;/span&gt; 11月 &lt;span class="m"&gt;30&lt;/span&gt; 20:37 ./
drwxr-xr-x &lt;span class="m"&gt;0&lt;/span&gt; toor toor  &lt;span class="m"&gt;512&lt;/span&gt; 11月 &lt;span class="m"&gt;30&lt;/span&gt; 20:37 ../
-rw------- &lt;span class="m"&gt;1&lt;/span&gt; toor toor &lt;span class="m"&gt;1679&lt;/span&gt; 11月 &lt;span class="m"&gt;30&lt;/span&gt; 20:37 id_rsa
-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; toor toor  &lt;span class="m"&gt;398&lt;/span&gt; 11月 &lt;span class="m"&gt;30&lt;/span&gt; 20:37 id_rsa.pub
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_2" class="h16"&gt;上传公钥&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;上传公钥到路由器&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ssh-copy-id root@tw -p1022
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;此时公钥在路由器中的位置： /root/.ssh/authorized_keys&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;将公钥拷贝到 dropbear 目录下,并赋予争取的权限&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cp /root/.ssh/authorized_keys /etc/dropbear/
chmod &lt;span class="m"&gt;700&lt;/span&gt; /etc/dropbear
chmod &lt;span class="m"&gt;600&lt;/span&gt; /etc/dropbear/authorized_keys
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_3" class="h16"&gt;使用私钥登陆&lt;/h3&gt;&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ssh -i ~/.ssh/id_rsa root@tw -p 1022
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;不出意外，已经可以免密码登陆了。&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_4" class="h16"&gt;更便利&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;虽然省去密码，但 SSH 命令还是要敲的，那就想办法更便利些。&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;vim .ssh/config
&lt;span class="c1"&gt;# 添加如下配置&lt;/span&gt;
Host gee
HostName tw
Port 1022
IdentityFile ~/.ssh/id_rsa
User root
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;然后就可以使用 Host 指定的名称登陆了。&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;toor@SurfaceBook:~$ ssh gee                                                                                                                                                                                                                  


BusyBox v1.25.1 &lt;span class="o"&gt;()&lt;/span&gt; built-in shell &lt;span class="o"&gt;(&lt;/span&gt;ash&lt;span class="o"&gt;)&lt;/span&gt;

***********************************************************
              __  __  _              _   ____  _   TM
             / / / / &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; _      __  &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; / __/ &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt;
            / /_/ / / / &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; /&lt;span class="p"&gt;|&lt;/span&gt; / / / / / /_  / / 
           / __  / / /  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;/ &lt;span class="p"&gt;|&lt;/span&gt;/ / / / / __/ / /  
          /_/ /_/ /_/   &lt;span class="p"&gt;|&lt;/span&gt;__/&lt;span class="p"&gt;|&lt;/span&gt;__/ /_/ /_/   /_/   
                  http://www.hiwifi.com/
***********************************************************
root@Hiwifi:~# 
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_5" class="h16"&gt;Enjoy it&lt;/h3&gt;</summary>

  </entry>


  <entry>


    <title>解决GO语言编译程序无法在openwrt上运行的问题</title>

    <link href="http://stray.love/wen-ti-jie-jue-fang-an/jie-jue-goyu-yan-bian-yi-cheng-xu-wu-fa-zai-openwrtshang-yun-xing-de-wen-ti"  rel="alternate"></link>

    <updated>2017-11-19T08:17:59Z</updated>
    <id>wen-ti-jie-jue-fang-an/jie-jue-goyu-yan-bian-yi-cheng-xu-wu-fa-zai-openwrtshang-yun-xing-de-wen-ti</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h3 id="toc_0" class="h16"&gt;问题&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;Aria2Gee 插件靠 frp 进行内网穿透，但一直以来都存在一个诡异的问题：个别机型上 frpc 无法运行，具体表现是运行之后进程就被阻塞住无响应。&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_1" class="h16"&gt;转机&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;由于 frpc 不是我自己编译的，所以这个问题一直都没解决。直到最近，在极路由插件开发群，一位朋友用 go 写了 hello world 程序，放在极路由上运行时遇到相同的问题。经过排查他发现是内核未开启 FPU(floating point unit) emulator 选项。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;于是我也去验证了下 frpc 无法运行是否也是同样的原因。手动运行 frpc 然后 log 如下：&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Nov &lt;span class="m"&gt;15&lt;/span&gt; 18:57:59 Hiwifi kern.info 
 kernel: &lt;span class="o"&gt;[&lt;/span&gt; 2031.780000&lt;span class="o"&gt;]&lt;/span&gt; FPU emulator disabled, 
 make sure your toolchainwas compiled with software floating point support &lt;span class="o"&gt;(&lt;/span&gt;soft-float&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;emmmm~~！确实是这个问题（感觉 debug 时的程序员都像柯南）&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_2" class="h16"&gt;思路&lt;/h3&gt;
&lt;p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;既然提示未开启 FPU emulator ，那解决方法至少有两个：&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;将选项启用，并重新编译固件
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;golang 本身是否有编译选项不依赖于 FPU emulator 。
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;方法1显然是不现实的，我无法左右官方 ROM 的编译选项。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;至于方法2能否实现就要看 golang 是不是支持了。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;从 golang 的 wiki 来看是没戏的：&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_end"&gt;&lt;a class="md_compiled" href="https://github.com/golang/go/wiki/MinimumRequirements#mips-big-endian-and-mipsle-little-endian"&gt;MinimumRequirements&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;Google 关键字 &amp;quot;MIPS FPU golang&amp;quot;，emmmmm~！果然很多人遇到了这个问题，&lt;a class="md_compiled" href="https://github.com/golang/go/issues/18162"&gt;runtime: mips32 soft float point support&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;从 issue 的回复来看，官方似乎会在接下来的版本支持类似的特性（emmmmm~~也就是说现在是不支持的），但事情还是有转机的，发现有朋友放出了 patch ，&lt;a class="md_compiled" href="https://github.com/golang/go/issues/18162#issuecomment-318880038"&gt;go1.8.3-sf-patch&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block md_block_as_opening md_has_block_below md_has_block_below_ol"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;所以接下来的思路很清晰了：&lt;/span&gt;
&lt;/p&gt;


&lt;ol&gt;
&lt;li class="md_li"&gt;&lt;span&gt;下载 go 1.8.3 的代码
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;打上 issue 提供的 patch
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;重新编译 golang
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;用新编译出的 golang 编译 frp
&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="toc_3" class="h16"&gt;解决&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;最后确实按照上面的思路解决了问题，但编译的过程有些复杂就不在这篇里面写了。上面提供的信息已经足够你自己动手解决问题了。&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;当然，最后还是要提供编译好 frpc 文件的，见下面链接。&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_dom_embed md_line_start md_line_end"&gt;&lt;a class="md_compiled" href="https://github.com/IxsCN/frpc_mipsle_noFPU"&gt;frpc_mipsle_noFPU&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_4" class="h16"&gt;后&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;虽然解决了问题，但不知道 golang 模拟的 FPU 会不会带来性能问题，特别是 MTK 这种本来就很弱的 CPU。emmmm~慢总比不能用强吧~~！&lt;/span&gt;
&lt;/p&gt;</summary>

  </entry>


  <entry>


    <title>搭建群晖交叉编译环境并编译Aria2</title>

    <link href="http://stray.love/itshou-zha/da-jian-qun-hui-jiao-cha-bian-yi-huan-jing-bing-bian-yi-aria2"  rel="alternate"></link>

    <updated>2017-10-05T15:09:00Z</updated>
    <id>itshou-zha/da-jian-qun-hui-jiao-cha-bian-yi-huan-jing-bing-bian-yi-aria2</id>

    <author>
      <name>天涼好個秋.</name>

    </author>
    <summary type="html">&lt;h3 id="toc_0" class="h16"&gt;前&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;一直想自己编译一个群晖上的 aria2 ，正好国庆假期，自己折腾下，这里是折腾过程的流水账，仅作记录之用。&lt;/span&gt;
&lt;/p&gt;

&lt;h3 id="toc_1" class="h16"&gt;搭建官方编译环境&lt;/h3&gt;
&lt;p class="md_block  md_has_block_below md_has_block_below_ul"&gt;
    &lt;span class="md_line md_line_start"&gt;找到了官方文档，搭建似乎很容易:&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_end"&gt;官方的文档 &lt;a class="md_compiled" href="https://developer.synology.com/developer-guide/index.html"&gt;DSM_Developer_Guide&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;编译环境的需求如下：


&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;64bit linux environment. 
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Bash (&amp;gt;= 4.1.5) 
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;Python (&amp;gt;= 2.7.3)
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;建立工作目录

&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir -p /toolkit/
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;下载toolkit
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /toolkit/
git clone https://github.com/SynologyOpenSource/pkgscripts-ng.git
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;更新环境
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;version="6.1"
platform="armada375"
cd /toolkit/pkgscripts-ng
./EnvDeploy -v ${version} -p ${platform}&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;更新好之后的目录结构
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;/toolkit
├── build_env
│   └── ds.armada375-6.1
├── pkgscripts-ng
│   ├── CodeSign.php
│   ├── EnvDeploy
│   ├── include
│   ├── PkgCreate.py
│   ├── ProjectDepends.py
│   ├── README.md
│   ├── SynoBuild
│   └── SynoInstall
└── toolkit_tarballs
    ├── base_env-6.1.txz
    ├── ds.armada375-6.1.dev.txz
    └── ds.armada375-6.1.env.txz
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;进入 chroot 环境
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo chroot /toolkit/build_env/ds.armada375-6.1
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;继续看文档发现，这是编译官方安装的环境，我似乎不需要弄这么复杂，弃坑。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="toc_2" class="h16"&gt;搭建交叉编译环境&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start"&gt;根据 NAS 型号，选择编译器&lt;br /&gt;&lt;/span&gt;
    &lt;span class="md_line md_line_dom_embed md_line_end"&gt;&lt;a class="md_compiled" href="https://sourceforge.net/projects/dsgpl/files/DSM%206.1%20Tool%20Chains/Marvell%20Armada%20375%20Linux%203.2.40/armada375-gcc493_glibc220_hard-GPL.txz"&gt;armada375-gcc493_glibc220_hard-GPL.txz&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;

&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;解压文件到 /usr/local

&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;tar -zJf armada375-gcc493_glibc220_hard-GPL.txz /usr/local
cp -rf /usr/local/arm-unknown-linux-gnueabi/* /usr/local/&lt;/code&gt;&lt;/pre&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_3" class="h16"&gt;编译依赖库&lt;/h3&gt;
&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;在 github 上搜索了下有人写好了编译的脚本,&lt;a class="md_compiled" href="https://github.com/q3aql/aria2-static-builds"&gt;aria2-static-builds&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;


&lt;p class="md_block"&gt;
    &lt;span class="md_line md_line_start md_line_end"&gt;嗯，自己修改了下&lt;/span&gt;
&lt;/p&gt;

&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;# In this configuration, the following dependent libraries are compiled:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# * zlib&lt;/span&gt;
&lt;span class="c1"&gt;# * c-ares&lt;/span&gt;
&lt;span class="c1"&gt;# * expat&lt;/span&gt;
&lt;span class="c1"&gt;# * sqlite3&lt;/span&gt;
&lt;span class="c1"&gt;# * openSSL&lt;/span&gt;
&lt;span class="c1"&gt;# * libssh2&lt;/span&gt;

&lt;span class="c1"&gt;#CHECK TOOL FOR DOWNLOAD&lt;/span&gt;
 aria2c --help &amp;gt; /dev/null
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; -eq &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
   &lt;span class="nv"&gt;DOWNLOADER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;aria2c --check-certificate=false&amp;quot;&lt;/span&gt;
 &lt;span class="k"&gt;else&lt;/span&gt;
   &lt;span class="nv"&gt;DOWNLOADER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;wget -c&amp;quot;&lt;/span&gt;
 &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;## DEPENDENCES ##&lt;/span&gt;
&lt;span class="nv"&gt;ZLIB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
&lt;span class="nv"&gt;OPENSSL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://www.openssl.org/source/openssl-1.0.2k.tar.gz
&lt;span class="nv"&gt;EXPAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://sourceforge.net/projects/expat/files/expat/2.2.0/expat-2.2.0.tar.bz2
&lt;span class="nv"&gt;SQLITE3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://www.sqlite.org/2017/sqlite-autoconf-3180000.tar.gz
&lt;span class="nv"&gt;C_ARES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://c-ares.haxx.se/download/c-ares-1.12.0.tar.gz
&lt;span class="nv"&gt;SSH2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://www.libssh2.org/download/libssh2-1.7.0.tar.gz

&lt;span class="c1"&gt;## CONFIG ##&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arm-unknown-linux-gnueabi&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown/build_libs&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown/build_libs&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;TOOL_BIN_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/local/&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;/bin&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOOL_BIN_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:&lt;span class="nv"&gt;$PATH&lt;/span&gt;

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-mhard-float -mfpu=vfpv3&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;DEST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown/build_libs&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc
&lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++
&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-L&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;&lt;span class="s2"&gt;/lib&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CPPFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-I&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;&lt;span class="s2"&gt;/include&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CXXFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CFLAGS&lt;/span&gt;
&lt;span class="nv"&gt;MAKE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;make -j`nproc`&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CONFIGURE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./configure --prefix=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --host=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;BUILD_DIRECTORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/

&lt;span class="c1"&gt;## BUILD ##&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$BUILD_DIRECTORY&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# zlib build&lt;/span&gt;
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$ZLIB&lt;/span&gt;
  tar zxvf zlib-1.2.11.tar.gz
  &lt;span class="nb"&gt;cd&lt;/span&gt; zlib-1.2.11/
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;STRIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-strip &lt;span class="nv"&gt;RANLIB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-ranlib &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ &lt;span class="nv"&gt;AR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-ar &lt;span class="nv"&gt;LD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-ld ./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; --static
  make
  make install
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# expat build&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$EXPAT&lt;/span&gt;
  tar jxvf expat-2.2.0.tar.bz2
  &lt;span class="nb"&gt;cd&lt;/span&gt; expat-2.2.0/
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ ./configure --host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt; --build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;dpkg-architecture -qDEB_BUILD_GNU_TYPE&lt;span class="sb"&gt;`&lt;/span&gt; --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; --enable-static&lt;span class="o"&gt;=&lt;/span&gt;yes --enable-shared&lt;span class="o"&gt;=&lt;/span&gt;no
  make
  make install
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# c-ares build&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$C_ARES&lt;/span&gt;
  tar zxvf c-ares-1.12.0.tar.gz
  &lt;span class="nb"&gt;cd&lt;/span&gt; c-ares-1.12.0/
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ ./configure --host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt; --build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;dpkg-architecture -qDEB_BUILD_GNU_TYPE&lt;span class="sb"&gt;`&lt;/span&gt; --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; --enable-static --disable-shared
  make
  make install
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# Openssl build&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$OPENSSL&lt;/span&gt;
  tar zxvf openssl-1.0.2k.tar.gz
  &lt;span class="nb"&gt;cd&lt;/span&gt; openssl-1.0.2k/
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ ./Configure linux-armv4 &lt;span class="nv"&gt;$CFLAGS&lt;/span&gt; --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; shared zlib zlib-dynamic -D_GNU_SOURCE -D_BSD_SOURCE --with-zlib-lib&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;/lib --with-zlib-include&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;/include
  make &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CC&lt;/span&gt;
  make &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CC&lt;/span&gt; install &lt;span class="nv"&gt;INSTALLTOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt; &lt;span class="nv"&gt;OPENSSLDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;/ssl
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# sqlite3&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$SQLITE3&lt;/span&gt;
  tar zxvf sqlite-autoconf-3180000.tar.gz
  &lt;span class="nb"&gt;cd&lt;/span&gt; sqlite-autoconf-3180000/
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ ./configure --host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt; --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; --enable-static --enable-shared --build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;dpkg-architecture -qDEB_BUILD_GNU_TYPE&lt;span class="sb"&gt;`&lt;/span&gt;
  make
  make install
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;# libssh2&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  &lt;span class="nv"&gt;$DOWNLOADER&lt;/span&gt; &lt;span class="nv"&gt;$SSH2&lt;/span&gt;
  tar zxvf libssh2-1.7.0.tar.gz
  &lt;span class="nb"&gt;cd&lt;/span&gt; libssh2-1.7.0/
  rm -rf &lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/libssh2.pc
  &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/ &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/ &lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc &lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++ &lt;span class="nv"&gt;AR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-ar &lt;span class="nv"&gt;RANLIB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-ranlib ./configure --host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt; --without-libgcrypt --with-openssl --without-wincng --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; --enable-static --disable-shared
  make
  make install
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="c1"&gt;#cleaning&lt;/span&gt;
  &lt;span class="nb"&gt;cd&lt;/span&gt; ..
  rm -rf c-ares*
  rm -rf sqlite-autoconf*
  rm -rf zlib-*
  rm -rf expat-*
  rm -rf openssl-*
  rm -rf libssh2-*
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;finished!&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_4" class="h16"&gt;编译 Aria2&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;下载源代码
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /root/
wget https://github.com/aria2/aria2/releases/download/release-1.32.0/aria2-1.32.0.tar.gz
tar -zxf aria2-1.32.0.tar.gz -C ./
mv aria2-1.32.0/ aria2/
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;configure
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;# In this configuration, the following dependent libraries are used:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# * zlib&lt;/span&gt;
&lt;span class="c1"&gt;# * c-ares&lt;/span&gt;
&lt;span class="c1"&gt;# * expat&lt;/span&gt;
&lt;span class="c1"&gt;# * sqlite3&lt;/span&gt;
&lt;span class="c1"&gt;# * openSSL&lt;/span&gt;
&lt;span class="c1"&gt;# * libssh2&lt;/span&gt;

&lt;span class="c1"&gt;## CONFIG ##&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;unknown&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arm-unknown-linux-gnueabi&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown/build_libs&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;TOOL_BIN_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/local/&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;/bin&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOOL_BIN_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:&lt;span class="nv"&gt;$PATH&lt;/span&gt;

&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-mhard-float -mfpu=vfpv3&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;DEST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/opt/aria2-arm-unknown/build_libs&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-gcc
&lt;span class="nv"&gt;CXX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;-g++
&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-L&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;&lt;span class="s2"&gt;/lib&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CPPFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-I&lt;/span&gt;&lt;span class="nv"&gt;$DEST&lt;/span&gt;&lt;span class="s2"&gt;/include&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CXXFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$CFLAGS&lt;/span&gt;
&lt;span class="nv"&gt;MAKE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;make -j`nproc`&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CONFIGURE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;./configure --prefix=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --host=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

./configure &lt;span class="se"&gt;\&lt;/span&gt;
    --host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOST&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;dpkg-architecture -qDEB_BUILD_GNU_TYPE&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --disable-nls &lt;span class="se"&gt;\&lt;/span&gt;
    --without-gnutls &lt;span class="se"&gt;\&lt;/span&gt;
    --with-openssl &lt;span class="se"&gt;\&lt;/span&gt;
    --without-libxml2 &lt;span class="se"&gt;\&lt;/span&gt;
    --with-libz --with-libz-prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --with-libexpat --with-libexpat-prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --with-slite3 --with-sqlite3-prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --with-libcares --with-libcares-prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LOCAL_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    --with-ca-bundle&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/etc/ssl/certs/ca-certificates.crt&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-L&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;/lib&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$LOCAL_DIR&lt;/span&gt;&lt;span class="s2"&gt;/lib/pkgconfig&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;ARIA2_STATIC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;make 
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;make -j4 &lt;span class="nv"&gt;V&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;s
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;链接时遇到一些小问题，库的位置不对，复制下。
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cp /usr/local/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot/lib/* /usr/local/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/lib/
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;install
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;make install
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;优化编译出的二进制文件
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite code_lang_shell  highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;arm-unknown-linux-gnueabi-strip -s /opt/aria2-arm-unknown/bin/armle-unknown-linux-aria2c
&lt;/pre&gt;&lt;/div&gt;

&lt;!--block_code_end--&gt;&lt;h3 id="toc_5" class="h16"&gt;其他&lt;/h3&gt;
&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;修改 max-connections-per-server 默认值

&lt;ul&gt;
&lt;li class="md_li"&gt;&lt;span&gt;自己修改 OptionHandlerFactory.cc 源代码就好
&lt;/span&gt;&lt;/li&gt;
&lt;li class="md_li"&gt;&lt;span&gt;具体详见这里 &lt;a class="md_compiled" href="https://github.com/aria2/aria2/issues/580"&gt;How can i build aria2c with max-connections-per-server more than 16&lt;/a&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</summary>

  </entry>


</feed>