You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:40:35