skynet-mmo类型demo
这是云风的一个开源项目skynet的一个mmo运用示例,也被云风列到wiki中的 use列表 中,对于了解服务器框架的开发非常有用(至少对我而言),wiki请看点我
部署
Git: https://github.com/jintiao/some-mmorpg
下载编译openssl
下载编译skynet到 some-mmorpg/3rd/skynet中
编译some-mmorpg
1
2cd 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
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
7cd 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)
最后终于愉快跑起来了
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)
使用挂载的方式,容器里只放环境
- git 拉下我自己更新到最新 skynet api 的代码,里面的 openssl 库已经编译好了,自行编译可参考 [编译 openssl](#编译 openssl)
1 | git clone --recursive git@github.com:yangxuan0261/Testmmo-server.git a_mmo_skynet |
- 部署
1 | docker run \ |
编译 skynet
1
2cd /skyet_app/3rd/skynet
make linux编译 server
1
2cd /skyet_app/server
make all修改 redis 的连接配置,把 ip 修改为 容器启动时连接的 redis 别名,也就是 redis_db
1
2
3
4
5
6vi /skyet_app/server/lualib/config/database.lua
修改配置为
local host = "redis_db"
local port = 6379
local db = 0修改启动脚本的权限,并测试器启动运行
1
2
3
4
5
6
7
8
9
10
11
12cd /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 selfok, done!
编译 openssl
从 openssl clone 了一个 1.0.2 的稳定版本,但貌似不能用,然后就去官网下了个压缩包 openssl-1.0.2.tar.gz ,
1
2
3
4
5
6
7
8
9
10
11
12sudo 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
7ls -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