[Erlang] - EPMD

本文探讨了游戏服务器网络问题中EPMD的作用,它是Erlang的端口映射守护进程,负责维护集群节点连接,解析节点名称到IP和端口。文章详细介绍了EPMD的原理、源码结构和测试流程,以及与erlang节点的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏服和大区服(也有的叫网关服的)短暂断连并短时间内又再次链接。
在这里插入图片描述
考虑可能是
1.大区服服务器网络问题(同事同时间没出现问题,pass)。
2.配置问题引发(是能正常连接的,pass)。
3.游戏服网络问题(就是它!!!!)。
由此开始了解EPMD(Erlang Port Mapper Daemon)。

什么是epmd?

epmd 代表 Erlang 端口映射守护进程(Erlang Port Mapper Daemon),默认绑定在4369端口上。每启动一个节点(-name/-sname),都会检查本地机器上是否运行着 epmd ,如果没有,节点就会自行启动 epmd ,epmd 会追踪在本地机器上运行的每个节点,并记录分配给它们的端口。epmd负责维护集群内的节点连接,提供节点名称到IP地址及端口的解析服务,相当于一个内置的DNS服务。
源码可以查看$OTP/erts/epmd目录。
【epmd.c】
函数 epmd_dbg 是对函数 epmd 的封装,便于在 debug 模式下使用 epmd ;
给出了如何在 linux 和 windows 上实现 daemon 函数,以及与 syslog 的配合;
【epmd.h】
定义了 epmd 所采用协议的消息编码(C语言侧定义)。

【epmd_int.h】
针对跨平台函数和变量进行定义。

【epmd_cli.c】
实现了 epmd 命令行功能所需的的 API 调用。

【epmd_srv.c】
基于 select 实现了 epmd 服务程序的事件驱动主循环;实现了针对上述 epmd 协议的解析。服务模型为一问一答式。
通过对 select 超时时间的约束(最大 5s),模拟了 busy server 的 delay_accept 和 delay_write 功能。

在 otp_src_xxx\lib\kernel\src\ 中,在 erlang 代码层面实现了与 epmd 服务程序的协议交互。

【erl_epmd.erl】
基于 gen_server 行为模式、采用 TCP socket 方式与本地或远端 epmd 进行协议通信的实现。

【erl_epmd.hrl】
定义了 epmd 所使用协议的消息编码(Erlang 语言侧定义)。

在 otp_src_xxx\lib\erl_interface\src\epmd\ 中,与 erlang 层实现对应的底层 C 实现。

【ei_epmd.h】
常量定义。

【epmd_port.c】
通过 TCP socket 连接本地或远端 epmd ,并通过协议 EPMD_PORT2_REQ 获取 the distribution port of another node 。

【epmd_publish.c】
通过协议 EPMD_ALIVE2_REQ 向隐藏 node 发布自身的 listen port 和 alive name。

【epmd_unpublish.c】
通过协议 EPMD_STOP_REQ 停止指定名字的 node。

测试流程:
初始状态、没有启动epmd:

C:\Users\Administrator>tasklist | findstr epmd

C:\Users\Administrator>tasklist | findstr beam

另外开一个窗口启动一个erlang节点:

C:\Users\Administrator>erl -sname coco
Eshell V8.3  (abort with ^G)
(coco@DESKTOP-ID25IMT)1>

再次查看 可以发现epmd已经启动

C:\Users\Administrator>tasklist | findstr epmd
epmd.exe                      9676 Console                    1      3,500 K

C:\Users\Administrator>tasklist | findstr beam

C:\Users\Administrator>netstat -ano | findstr "9676"
  TCP    0.0.0.0:4369           0.0.0.0:0              LISTENING       9676
  TCP    127.0.0.1:4369         127.0.0.1:56979        ESTABLISHED     9676
  TCP    [::]:4369              [::]:0                 LISTENING       9676

<think>好的,我现在需要解决用户提到的两个问题:Erlang solutions ASC导入失败和post脚本执行失败。首先,我应该分别分析这两个问题可能的原因,然后找到相应的解决方法。 对于Erlang solutions ASC导入失败,可能的原因有几个。首先,用户可能没有正确下载或保存ASC密钥文件。有时候下载过程中文件可能损坏,或者保存路径不对,导致导入时找不到文件。其次,GPG密钥的信任设置可能有问题,如果密钥没有被正确信任,导入时会失败。还有可能是权限问题,比如用户没有足够的权限执行导入操作,或者GPG配置存在问题,比如配置文件损坏或路径错误。 解决方法方面,首先应该检查ASC文件是否正确下载。用户可以通过重新下载文件,并使用校验和验证完整性。例如,使用`sha256sum`命令检查文件的哈希值是否匹配官方提供的。接下来,确保使用正确的命令导入ASC文件,例如`gpg --import erlang-solutions.asc`。如果遇到权限问题,可能需要用`sudo`或者以管理员身份运行命令。另外,更新GPG的信任数据库也很重要,可以执行`gpg --update-trustdb`来更新信任信息。如果问题依然存在,尝试清除现有的GPG配置并重新导入,可能需要删除`~/.gnupg`目录,但要注意备份已有的密钥。 然后是post脚本执行失败的问题。可能的原因包括脚本本身的权限不足,比如没有执行权限。用户之前提到的`chmod +x`命令就是用来添加执行权限的,所以需要检查是否已经正确执行。另外,脚本中的路径错误也可能导致失败,比如使用了绝对路径而文件不在指定位置,或者相对路径不正确。环境变量问题也是一个可能因素,比如脚本依赖的Erlang或相关工具没有正确安装或不在PATH中。脚本内容错误,比如语法错误或逻辑问题,同样会导致执行失败。还有可能是依赖项缺失,比如缺少必要的库或软件包。 解决方法方面,首先确认脚本是否有执行权限,使用`ls -l scriptname.sh`查看权限,如果没有x权限,就用`chmod +x scriptname.sh`添加。接着检查脚本中的路径是否正确,尤其是涉及文件操作或外部命令调用的地方,使用绝对路径可能更可靠。确保环境变量正确设置,可以通过在脚本开头添加`export PATH=$PATH:/path/to/erlang`来指定路径。检查脚本语法是否有错误,可以用`bash -n scriptname.sh`进行静态检查,或者添加`set -x`来调试输出。安装缺失的依赖,比如Erlang运行时或其他所需的库,使用包管理器如`apt`或`yum`来安装。如果是脚本逻辑问题,可能需要联系开发者或查看文档进行修正。 最后,用户提供的引用中提到添加执行权限的命令,所以需要确认用户是否已经正确执行了这些步骤,如果执行后仍然失败,可能需要进一步检查脚本内容或系统配置。综合这些分析,整理出清晰的解决步骤,帮助用户逐步排查和解决问题。</think>### Erlang solutions ASC导入失败及post脚本执行失败的解决方案 #### 1. **ASC导入失败的原因与解决方法** **可能原因:** - **文件完整性问题**:下载的ASC密钥文件可能被截断或损坏[^1]。 - **GPG配置错误**:本地GPG版本不兼容或密钥环(keyring)权限不足。 - **信任链缺失**:未将密钥标记为可信,导致后续验证失败。 **解决步骤:** 1. **重新下载并验证ASC文件**: ```bash wget https://packages.erlang-solutions.com/debian/erlang_solutions.asc sha256sum erlang_solutions.asc # 与官方哈希值对比 ``` 2. **强制导入密钥**: ```bash gpg --no-default-keyring --keyring /usr/share/keyrings/erlang.gpg --import erlang_solutions.asc ``` 3. **设置密钥可信级别**: ```bash echo "trusted-key 434975BD900CCBE4" | gpg --import-ownertrust # 替换为实际密钥ID ``` 4. **更新APT仓库缓存**: ```bash sudo apt update ``` #### 2. **post脚本执行失败的原因与解决方法** **可能原因:** - **权限问题**:脚本未赋予执行权限,或用户权限不足[^1]。 - **路径依赖错误**:脚本中调用的命令(如`erl`或`epmd`)未在`$PATH`中。 - **依赖缺失**:缺少Erlang运行时或第三方库(如OpenSSL)。 **解决步骤:** 1. **添加执行权限**: ```bash chmod +x kafkastop.sh # 用户已执行类似操作,需确认脚本名称一致性 ``` 2. **指定解释器路径**: 在脚本首行添加: ```bash #!/bin/bash export PATH=/usr/local/erlang/bin:$PATH # 替换为实际Erlang安装路径 ``` 3. **调试脚本**: ```bash bash -x post_script.sh # 输出详细执行过程 ``` 4. **安装依赖项**: ```bash sudo apt install erlang-base openssl libwxgtk3.0-dev # 根据错误提示补充 ``` #### 引用说明 : 用户提供的引用显示已尝试添加脚本执行权限,需进一步检查路径与环境变量。若问题持续,建议结合`strace`工具追踪系统调用: ```bash strace -f -o debug.log ./kafkastop.sh ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值