问题标签 [erlang-ports]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - Erlang-C 端口在某些 unix 机器上不起作用
我正在使用教程http://www.erlang.org/doc/tutorial/c_port.html#id63121和 Joe Armstrong 的书中描述的标准 erlang-c 端口代码。
在我的 macbook 上,erlang 代码和 c 代码使用 write_exact 和 read_exact 愉快地通信。(我没有触及任何标准代码)。
但是当在 unix pdp 机器上运行完全相同的代码时,从 c 到 erlang 的通信会中断。具体来说,在服务器的循环中:
c 代码成功地从 erlang 代码接收到编码消息。然后,c 代码使用 write_exact 写回响应(在这种情况下,它是一个非常简单的带有两个字节标头的 OK 响应)。但是 erlang 代码从未收到此消息。上面的循环函数从不接收 {Port, {data, Data}}...
用于编写响应的 c 代码是标准代码(write_cmd 和 write_exact)。我没有触及任何标准代码:
调试 c 端,调用 write() 函数 - 但不知何故,erlang 端从未从端口接收到消息。
你们知道在这种情况下,在这台机器上,是什么导致这条消息无法从 c 回到 erlang 吗?(它适用于macbook,并且曾经在同一台pdp机器上工作——自从它上次工作以来我还没有接触过erlang代码)。可能与权限或其他事情有关,从而阻止 write_exact 中的写入实际写入任何内容?我很茫然。
c - C 和 Erlang:Erlang 端口示例
免责声明:该问题的作者对 Erlang 有一个平均的了解,对 C 有基本的了解。
我现在正在阅读互操作性教程用户指南。我已经成功编译了这个complex.c
例子,它可以与 Erlang Port 一起使用,没有任何问题。
但是,我想了解实际的 C 代码是如何工作的。我一般理解它:在示例中,它从标准输入中读取 2 个字节并检查第一个字节。根据第一个字节,它调用foo
或bar
函数。这是我目前对它的理解的极限。
因此,如果我们同时采用erl_comm.c
:
和port.c
:
每个功能实际上在那里做什么?li, len, i, wrote, got
变量的实际用途是什么?
还有一些小问题:
- 为什么函数没有任何返回类型,甚至
void
s? - 当 Erlang 端口向 C 发送数据时,第一个字节确定要调用的函数。如果字节保存十进制 1,则
foo()
调用,如果字节保存十进制 2,则bar()
调用。如果不进行任何更改,该协议可用于调用多达 255 个不同的 C 函数,每个函数只有 1 个参数。那正确吗? - “添加长度指示器将由 Erlang 端口自动完成,但必须在外部 C 程序中显式完成”。这意味着什么?它是在哪一行代码上完成的?
- 来自教程:“默认情况下,C 程序应从标准输入(文件描述符 0)读取并写入标准输出(文件描述符 1)。” 然后:“请注意,stdin 和 stdout 用于缓冲输入/输出,不应用于与 Erlang 的通信!” 这里有什么问题?
- 为什么
buf
初始化为[100]
?
erlang - erlang 中的 inet_addr 功能
正如问题所说,是否有任何功能或模块可以执行inet_addr
?
谷歌的结果没有建议任何直接的方式,或者我错过了什么?
谢谢。
erlang - 为什么 EUnit 将 .beam 文件编译成 .eunit/ebin?
免责声明:这个问题的作者主要有 Erlang/OTP 的理论知识。
我有一个小型 OTP 应用程序,它myapp/ebin
通过open_port()
. 当我运行应用程序本身时,一切顺利,可执行文件的端口已成功打开。
但是当我尝试为应用程序运行单元测试时,依赖于open_port()
失败的单元测试,因为当开始时EUnit
应用程序启动时,尝试在myapp/.eunit/ebin
.
如何在不更改应用程序本身代码的情况下更改该行为?如何使用与运行应用程序本身相同的当前目录运行 EUnit 测试?(我的意思是更改提供可执行文件路径的代码只是为了能够运行 EUnit 并不是一个好主意)。
编辑:我遵循了 Erlang邮件列表中的建议,但是code:priv_dir(myapp_name)
返回{error, bad_name}
。
编辑:我可以看到.eunit/
包含modulename.beam
文件并且ebin/
包含modulename.beam
文件和modulename_tests.beam
文件。现在我完全迷失了。当我运行时make test
,rebar
运行eunit
命令,该命令调用目录中的每个modulename_tests.beam
文件,该文件ebin/
调用目录中的相应modulename.beam
文件.eunit/
(filename:absname("")
清楚地表明modulename.beam
文件是.eunit/
在测试期间执行的)。为什么会这样?为什么我们需要modulename.beam
从目录运行文件.eunit/
而不是ebin/
?
为什么我们实际上需要在myapp/ebin
和中有相同的 .beam 文件myapp/.eunit/ebin
?
PS我已经阅读了官方文档并没有找到解决方案。
c++ - 通过 erlang 端口在 qt 应用程序和 erlang 服务器之间进行通信
我需要在 ubuntu 中创建一个客户端(qt c++)和一个服务器(erlang)。服务器应该是通用的 OTP 服务器。客户端应该连接到服务器并发送一些数据(字符串)并且 erlang srv 应该返回相同的字符串。
请建议我一个示例代码或框架来实现这些东西。
我决定从这个开始:
请帮助我处理客户端和服务器。
erlang - erlang 端口的端口信息如何更改为未定义?
我得到一个 erlang 服务器,许多客户端使用 tcp 连接到服务器。
几分钟后,使用 erlang:ports() 和 erlang:port_info(),我可以发现某些端口的 port_info 未定义,并且该端口已关闭。无论如何我都找不到将其从端口中删除。
那么为什么会发生这种情况,我怎样才能从 erlang 端口中删除这些未定义的端口呢?
erlang - 二郎:TCP服务器
嗨,我是 Erlang 中的一只新蜜蜂,但设法创建了一个简单的 TCP 服务器,它以被动模式接受客户端并显示消息。每次新客户端连接到服务器时,我都会生成一个新进程。有没有一种方法可以使用客户端连接时产生的进程向客户端发送消息。
这是代码。
如果我做的话,我可以有一些事情吗?
Pid!{"Some Message"}
. 并且消息被发送到与具有非阻塞io的进程关联的套接字,
functional-programming - 如何知道用户是否在线仅提供用户名/昵称/参与者但不提供整个 JID (Ejabberd)
我正在自定义模块mod_muc_room
,我想添加一个知道用户是否在线但只提供用户名的功能。在模块中我可以找到函数is_user_online
:
我知道我必须提供用户名、服务器和资源。LJID,会导致类似{"user", "myserver.com, "someid"}
我想添加一个返回相同但只提供“用户”的函数
我可以就如何实现这一目标提出一些建议吗?
erlang - Erlang - 连接到已经运行的外部程序?
我想将 erlang 连接到外部 C# 程序。我知道有多种方法可以做到这一点,1)使用端口(由 OTP 提供),2)TCP/UDP/网络套接字,3)os:cmd 等。选项 1 和 3 假设 erlang 正在启动这些程序,如果您只想与外部程序交互,选项 2 需要大量设置。
问题是:erlang 是否允许创建端口并将其连接到已经运行的程序?我知道这会引入一些有趣的安全问题,但这个想法听起来是可行的,所以我想我会看看之前是否有人尝试过这样做。
谢谢