skynet-mmo类型demo

这是云风的一个开源项目skynet的一个mmo运用示例,也被云风列到wiki中的 use列表 中,对于了解服务器框架的开发非常有用(至少对我而言),wiki请看点我


部署

Git: https://github.com/jintiao/some-mmorpg

  1. 下载编译openssl

  2. 下载编译skynet到 some-mmorpg/3rd/skynet中

  3. 编译some-mmorpg

    1
    2
    # cd some-mmorpg/server 
    # make all

踩坑记录

  • Q1:lua_cjson.c:597:58: error: macro “lua_integer2str” requires 3 arguments, but only 2 given

    A:原因是不兼容lua5.3,参照云风维护的luacjson,将lua_cjson.c中597行

    1
    len = lua_integer2str(strbuf_empty_ptr(json), num); 

    修改为

    1
    len = sprintf(strbuf_empty_ptr(json), LUA_INTEGER_FMT, num);
  • Q2:lualib-src/lua-uuid.c:4:1: error: unknown type name ‘uint32_t’

    A:最简答的修复方式直接包含头文件 A simple fix is to add the line |

    1
    #include <stdint.h>
  • Q3:libcrypto.so.1.0.0: cannot open shared object file

    A:建个软连接,/usr/lib64 中的so库链接到自己编译好的so,因为有些库加载时从原生库中加载
    sudo ln -s /root/Desktop/some-mmorpg/3rd/openssl/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

    (推荐)或者把编好的opensll 的libcrypto* 拷贝到 原生库中/usr/lib64/

    1
    2
    3
    4
    5
    6
    7
    # cd some-mmorpg/3rd/openssl/ 
    # find . -name “libcrypto*”
    ./libcrypto.a
    ./libcrypto.pc
    ./libcrypto.so.1.0.0
    ./libcrypto.so
    # cp libcrypto.* /usr/lib64/
  • Q4:NOAUTH Authentication required,Connect to 127.0.0.1:6379 failed (nil)

    A:其实是Redis开了密码验证,关掉redis的密码验证即可

  • 最后终于愉快跑起来了

    1
    2
    3
    4
    5
    6
    7
    [root@localhost server]# ./run 
    [:00000001] LAUNCH logger
    [:00000002] LAUNCH snlua bootstrap
    [:00000003] LAUNCH snlua launcher
    [:00000004] LAUNCH snlua cdummy
    ...
    [:00000002] KILL self

使用 docker 环境跑(2017-07-23)

使用挂载的方式,容器里只放环境

  1. git 拉下我自己更新到最新 skynet api 的代码,里面的 openssl 库已经编译好了,自行编译可参考 [编译 openssl](#编译 openssl)
1
$ git clone --recursive git@github.com:yangxuan0261/Testmmo-server.git a_mmo_skynet
  1. 部署
1
2
3
4
5
6
7
8
9
10
$ docker run \
-it \
--name mmo_skynet \
-v /home/wilker/Desktop/a_mmo_skynet:/skyet_app \
-v $PWD/.ssh:/root/.ssh \
--link redis_server:redis_db \
-p 9777:9777 \
-p 9555:9555 \
my_skynet:16.04 \
bash
  1. 编译 skynet

    1
    2
    $ cd /skyet_app/3rd/skynet
    $ make linux
  2. 编译 server

    1
    2
    $ cd /skyet_app/server
    $ make all
  3. 修改 redis 的连接配置,把 ip 修改为 容器启动时连接的 redis 别名,也就是 redis_db

    1
    2
    3
    4
    5
    6
    $ vi /skyet_app/server/lualib/config/database.lua

    # 修改配置为
    local host = "redis_db"
    local port = 6379
    local db = 0
  4. 修改启动脚本的权限,并测试器启动运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cd /skyet_app/server
    $ chmod 700 run
    $./run
    [:00000001] LAUNCH logger
    [:00000002] LAUNCH snlua bootstrap
    [:00000003] LAUNCH snlua launcher
    ...
    dump from: ./service/laborserver.lua:32: in function <./service/laborserver.lua:18>
    - "all labor" = {
    - }
    [:00000035] LAUNCH snlua friendserver
    [:00000002] KILL self
  5. ok, done!


编译 openssl

  • 从 openssl clone 了一个 1.0.2 的稳定版本,但貌似不能用,然后就去官网下了个压缩包 openssl-1.0.2.tar.gz

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sudo mkdir -p /usr/local/openssl # 创建一个 生成库 的存放目录

    $ cd openssl_1.0.2/
    $ ./config shared -fPIC --prefix=/usr/local/openssl # --prefix 生成库 的存放目录
    $ sudo make && sudo make install

    # 编译好之后就能看见这些库了
    $ ls /usr/local/openssl/lib/
    engines libcrypto.a libcrypto.so libcrypto.so.1.0.0 libssl.a libssl.so libssl.so.1.0.0 pkgconfig

    # 然后拷贝需要用的 libcrypto 相关的库
    $ cp /usr/local/openssl/lib/libcrypto.* /your_dir

踩坑记录2

  • 编译 srp.so 时一直报错

    1
    lualib-src/lua-srp.c:4:25: fatal error: openssl/srp.h: No such file or directory
    • 发现在再makefile中 -I 引用的头文件路径下的文件确实存在,但就是一直报错,然后 ls -la 查看了下文件貌似都是一个 link,vi 一下文件竟然是空的。必须确定文件不是 link 才能找到该头文件。(被这个坑了好久)

      1
      2
      3
      4
      5
      6
      7
      $ ls -la
      lrwxrwxrwx 1 wilker wilker 22 Jul 23 20:38 aes.h -> ../../crypto/aes/aes.h # 错误姿势
      lrwxrwxrwx 1 wilker wilker 24 Jul 23 20:38 asn1.h -> ../../crypto/asn1/asn1.h

      $ ls -la
      -rwxrw-rw- 1 wilker wilker 6182 Jan 22 2015 aes.h # 正确姿势
      -rwxrw-rw- 1 wilker wilker 63097 Jan 22 2015 asn1.h