Ubuntu 22.04下Erlang调用gen_sctp:open报错eprotonosupport排查
解决Erlang gen_sctp:open返回{error,eprotonosupport}的问题
针对Ubuntu 22.04本地系统中Erlang应用调用gen_sctp:open(...)返回{error,eprotonosupport}的问题,结合你已完成的排查步骤,可尝试以下方案:
1. 确认Erlang是否启用SCTP支持
部分Ubuntu默认分发的Erlang包可能未编译SCTP支持,可通过以下命令验证:
erl -noshell -eval "io:format('~p~n', [gen_sctp:module_info(attributes)])." -s init stop
如果输出中没有sctp相关属性,或直接执行gen_sctp:open().仍返回相同错误,说明当前Erlang版本未启用SCTP支持,需要重新编译Erlang并开启SCTP选项。
2. 重新编译带SCTP支持的Erlang
步骤如下:
- 安装编译依赖:
sudo apt-get install build-essential libssl-dev libsctp-dev lksctp-tools - 下载Erlang源码(以OTP 26稳定版为例):
wget https://github.com/erlang/otp/releases/download/OTP-26.1.2/otp_src_26.1.2.tar.gz tar xf otp_src_26.1.2.tar.gz cd otp_src_26.1.2 - 配置编译选项(开启SCTP):
./configure --enable-sctp --prefix=/usr/local/erlang - 编译并安装:
make && sudo make install - 将新安装的Erlang加入环境变量:
echo 'export PATH=/usr/local/erlang/bin:$PATH' >> ~/.bashrc source ~/.bashrc - 验证:重新启动Erlang shell,调用
gen_sctp:open(3868).测试是否正常。
3. 检查系统SCTP模块加载状态
虽然lynis检测显示SCTP已启用,但可手动确认模块是否加载:
lsmod | grep sctp
如果无输出,手动加载模块:
sudo modprobe sctp
并配置开机自动加载:
echo 'sctp' | sudo tee /etc/modules-load.d/sctp.conf
4. 检查网络安全策略限制
本地系统的AppArmor可能限制了Erlang的网络权限,执行以下命令查看状态:
sudo aa-status
如果存在针对Erlang的限制规则,可临时停用测试:
sudo systemctl stop apparmor
若问题解决,需调整AppArmor规则以允许Erlang使用SCTP协议。
5. 验证gen_sctp调用参数
确保代码中gen_sctp:open的参数未指定错误的协议或域,例如:
- 避免错误指定
inet6域(若本地未启用IPv6支持) - 显式指定
sctp协议参数:gen_sctp:open(3868, [{proto, sctp}, {ip, {127,0,0,1}}]).
内容的提问来源于stack exchange,提问作者joraeune
相关产品推荐
相关产品推荐

