Erlang error?

<!-- lang: shell -->

Unable to load crypto library. Failed with error:
"load_failed, Failed to load NIF library: '/usr/local/erlang/R16B03-1/lib/erlang/lib/crypto-3.2/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'"
OpenSSL might not be installed on this system.
make: *** [deps] Error 1
[root@lambda-laptop riak]# erl


编辑文件 。。
 edit lib/crypto/c_src/crypto.c and change:

#if OPENSSL_VERSION_NUMBER >= 0x009080ffL \
        && !defined(OPENSSL_NO_EC) \
        && !defined(OPENSSL_NO_ECDH) \
        && !defined(OPENSSL_NO_ECDSA)
# define HAVE_EC
#endif



#if OPENSSL_VERSION_NUMBER >= 0x009080ffL \
        && !defined(OPENSSL_NO_EC) \
        && !defined(OPENSSL_NO_EC2M) \
        && !defined(OPENSSL_NO_ECDH) \
        && !defined(OPENSSL_NO_ECDSA)
# define HAVE_EC
#endif



http://erlang.org/pipermail/erlang-questions/2013-December/076327.html

早看到这个就好了,我也是用strace发现它用的是poll,顺便搞清楚了erlang的分布式节点通讯方式。

erlang分布式节点通讯,A节点连接B节点,如果在同一机器上,只需要进程间通讯就可以找到节点。不在同一台机器上,A先连接B所在机器的4369端口,寻找节点。如果找到,就通知B节点监听一个端口,再回复A让它连接这个端口。

监听4369端口的是个后台进程epmd,在linux上它使用select,它只建短连接。windows上是epmd.exe。在linux上,节点的监听端口使用poll,指定+K true参数以后,会使用epoll,当然需要编译时打开开关。

每个节点只会监听一个端口,2个节点之间建立连接后,节点之间任意方向的通讯都会走这条连接,这种通讯方式是最合理的,我也想用这种方式,不过这种方式通常是异步操作,实现起来比较复杂,所以一直没去做。

多个节点之间遵循的规则如下:
1、每个节点只监听一个端口。
2、A节点连接B节点,还没有建立连接,则A connect到B;如果B还没有监听端口,就开一个端口监听。

这种方式可以保证任意两节点之间断开连接,不影响其它节点,因为它使用的是网状连接。

你可能感兴趣的:(Erlang error?)