skynet环境搭建
本博客的使用环境
ubuntu20.04
gcc version 9.4.0
autoconf
1. 获取源码并且编译
1.1 获取源码
- github
git clone https://github.com/cloudwu/skynet.git
- gitee
git clone https://gitee.com/mirrors/skynet.git
不能访问github,可以去gitee里面clone镜像
1.2 编译
源码获取完毕之后直接使用make编译
make linux
如果不能访问github会报clone jemalloc的错误
解决方案是使用镜像仓库
vim .gitmodules
把url改为
[submodule "3rd/jemalloc"]
path = 3rd/jemalloc
url = https://gitee.com/mirrors/jemalloc.git
然后继续使用make
make linux
如果之后报没有aotoconfig,就先安装autoconf
2. demo测试
在skynet外创建一个test文件夹并且创建一个main.lua文件
在main.lua中实现一个简单的echo服务
local skynet = require "skynet"
local socket = require "skynet.socket"
local function event_loop(clientfd)
while true do
local data = socket.readline(clientfd)--从网络获取 以\n为分隔符的数据包
if not data then
return
end
print(clientfd, "recv:", data)
socket.write(clientfd, data.."\n")
end
end
local function accept(clientfd, addr)-- 回调函数的作用 就是可以将 fd绑定到其他actor
print("accept a connect:", clientfd, addr)
socket.start(clientfd) -- 将clientfd注册到epoll
skynet.fork(event_loop, clientfd) -- 实现一个简单的echo服务,可以通过 telnet 127.0.0.1 8001来连接skynet
end
skynet.start(function ()
local listenfd = socket.listen("0.0.0.0", 8001) -- socket bind listen
socket.start(listenfd, accept) -- 将listenfd注册到epoll,收到连接会回调accept函数
end)
之后创建skynet的配置文件 config(这个配置文件本质的lua文件)
thread=8 --工作线程数目
logger=nil
harbor=0
start="main" -- 启动第一个服务
lua_path="./skynet/lualib/?.lua;".."./test/lualib/?.lua;".."./skynet/lualib/?/init.lua"
luaservice = "./skynet/service/?.lua;".."./test/?.lua;".."./skynet/test/?.lua;"
lualoader = "./skynet/lualib/loader.lua"
cpath = "./skynet/cservice/?.so;"
lua_cpath = "./skynet/luaclib/?.so;"
目录结构为
.
├── config
├── skynet
│ ├── 3rd
│ ├── cservice
│ ├── examples
│ ├── HISTORY.md
│ ├── LICENSE
│ ├── luaclib
│ ├── lualib
│ ├── lualib-src
│ ├── Makefile
│ ├── platform.mk
│ ├── README.md
│ ├── service
│ ├── service-src
│ ├── skynet
│ ├── skynet-src
│ └── test
└── test
└── main.lua
启动skynet
./skynet/skynet ./config
使用netcat 连接测试
nc -nv 127.0.0.1 8001
成功测试完毕后说明skynet环境已经搭建完成了
3. 调试
3.1 c 代码调试
调试c代码只要编译的时候在gcc加上 ‘-g’ 选项,在skynet编译的时候是默认加上的
修改makefile文件关闭代码优化
把CFLAGS 的 -O2 改为-O0 或者直接删掉
CFLAGS = -g -O0 -Wall -I$(LUA_INC) $(MYCFLAGS)
然后重新编译
make clean
make linux
最后直接使用gdb调试即可
3.2 lua代码调试
lua调试要借助vs-code
3.2.1 安装vs-code的两个插件
remote-ssh(如果使用的windows的wsl则使用remote-wsl)
LuaPanda
3.2.2 使用vs-code连接远程linux
打开vs-code,按下ctrl + p
输入 ‘>remote-ssh’ 如果按下确认
选择 ‘Add New SSH Host’
输入远程服务器的用户名和ip
ssh zhaixue@192.168.224.131
选择完保存的文件后,再按下ctrl + p
点击对应的ip,最后输入密码即可
3.2.3 下载LuaPanda.lua
https://gitee.com/mirrors/luapanda/tree/master/Debugger
把下载的文件放到和config同级目录和skynet下lualib下面
3.2.4 安装luasocket
wget https://luarocks.org/releases/luarocks-3.9.0.tar.gz
tar zxpf luarocks-3.9.0.tar.gz
cd luarocks-3.9.0
./configure && make && sudo make install
sudo luarocks install luasocket
这里使用的是luarocks的方式安装luasocket
安装之前需要注意:目前版本的skynet使用的lua的5.4版本的,所以安装luarocks之前确保已经有了lua5.4的lua环境
安装完成之后修改config文件,添加luasocket的目录
thread=8 --工作线程数目
logger=nil
harbor=0
start="main" -- 启动第一个服务
lua_path="./skynet/lualib/?.lua;".."./test/lualib/?.lua;".."./skynet/lualib/?/init.lua"
luaservice = "./skynet/service/?.lua;".."./test/?.lua;".."./skynet/test/?.lua;"
lualoader = "./skynet/lualib/loader.lua"
cpath = "./skynet/cservice/?.so;"
lua_cpath = "./skynet/luaclib/?.so;".."/usr/local/lib/lua/5.4/?.so;" --luasocket
3.2.5 测试调试
点击运行->调试选择LuaPanda
点击设置按钮
将 ““stopOnEntry” 改为false
使用LuaPanda插件调试之前要满足两个添加
- 再lua中调用了LuaPanda的插件服务
- vs-code已经启动LuaPanda调试
启动skynet
./skynet/skynet ./config
在我们写的demo中插入代码
插入这里确保调这个函数的时候有lua服务
之后启动vs-code的调试
使用netcat连接
nc -nv 127.0.0.1 8001
连接完成后随意输入东西
然后可以看到已经在vscode中断下