Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用二进制协议尝试使用Elixir连接到OrientDB会返回无效的会话ID_Orientdb_Elixir - Fatal编程技术网

使用二进制协议尝试使用Elixir连接到OrientDB会返回无效的会话ID

使用二进制协议尝试使用Elixir连接到OrientDB会返回无效的会话ID,orientdb,elixir,Orientdb,Elixir,我正在尝试使用Elixir(1.0.5)连接到OrientDB(2.1RC5)。两者都在我的本地计算机上运行,我编写了以下代码作为第一次尝试连接: {:ok, socket} = :gen_tcp.connect(to_char_list("localhost"), 2424, [{:packet, :raw}, :binary], 30_000) a_r = receive do {:tcp, ^socket, <<_succes, version>>} ->

我正在尝试使用Elixir(1.0.5)连接到OrientDB(2.1RC5)。两者都在我的本地计算机上运行,我编写了以下代码作为第一次尝试连接:

{:ok, socket} = :gen_tcp.connect(to_char_list("localhost"), 2424, [{:packet, :raw}, :binary], 30_000)
a_r = receive do
{:tcp, ^socket, <<_succes, version>>} ->
  msg = <<2 :: 8>> <> #REQEST_CONNECT
    <<-1 :: 32>> <> #Negative Session-ID
    <<byte_size("Test") :: 32>> <> "Test" <> #Driver-name
    <<byte_size("0.0.1") :: 32>> <> "0.0.1" <> #Driver-version
    <<version :: 16>> <> #Protocol-version
    <<byte_size("") :: 32>> <> "" <> #Client-ID
    <<byte_size("Binary") :: 32>> <> "Binary" <> #serialization-impl
    <<1 :: 8>> <> #use token
    <<byte_size("root") :: 32>> <> "root" <> #user-name
    <<byte_size("orient") :: 32>> <> "orient" #usr-pwd

  :gen_tcp.send(socket, msg)
  receive do
    msg -> msg
  after
    10000 -> :error1
  end
after
  10000 -> :error2
end
{:ok,socket}=:gen_tcp.connect(到字符列表(“localhost”),2424,[{:packet,:raw},:binary],30_000)
a_r=接收do
{:tcp,^socket,}->
msg=#重新测试#连接
#负会话ID
“测试”#驱动程序名称
“0.0.1”#驱动程序版本
#协议版本
“”#客户端ID
“二进制”#序列化实现
#使用代币
“root”#用户名
“东方”#usr pwd
:gen_tcp.send(套接字,消息)
接收do
味精->味精
之后
10000->:错误1
结束
之后
10000->:错误2
结束
运行此代码后,我得到一个结果,第一个字节设置为0,但会话ID仍然是-1。始终返回令牌,无论我是否将其设置为0或1。如果我发送一个正整数作为会话ID,连接将被拒绝,如果我发送的密码无效,也会发生这种情况


我将代码与进行了比较,并检查了所有字段的顺序是否正确,格式是否正确,但我看不出哪里出错。

您发送的数据中的字段顺序正确。令人痛心的是,当您执行
操作时,您得到的是正确的版本,这有点运气不好,因为OrientDB在连接时只将版本写为一个短的(2个字节),而没有第一个字节区分OK或错误响应。因为版本很小(可能是31),所以它被写为带有两个字节的
,因此您的
version
变量具有正确的值。使用
代替:)

但这不是问题所在,你所问的是OrientDB相关的,不涉及长生不老药。OrientDB总是在客户端连接时将
-1
作为会话id发送回,因此您看到的行为是预期的。此外,始终会返回令牌(无论您是否说想要它):如果您不想要它,则返回一个空令牌。如果您要求它,它可能仍然是空的(这意味着服务器不支持基于令牌的身份验证)

您必须在连接时发送会话id
-1
(实际上是一个负整数),因为您仍然没有会话id,是的,如果会话id不存在,则传递正会话id将导致TCP连接断开

因此,您没有做错什么:)您得到的响应将类似于:

<<0, 255, 255, 255, 255, 0, 0, 32, 102, 0, 0, 0, 0>>

这意味着:

  • 0
    -正常响应
  • -1
    作为int32)-由于新连接,会话id为-1
  • 8294
    作为int32)-新会话的会话id,您必须将其用于同一连接上的后续请求
  • -令牌(在本例中为空,因为
    0
    int32是令牌字节的长度)

总之,用Elixir编写的OrientDB二进制驱动程序将在未来几天内开源(我知道,因为我写了:p),仅供参考。

您发送的数据中的字段顺序正确。令人痛心的是,当您执行
操作时,您得到的是正确的版本,这有点运气不好,因为OrientDB在连接时只将版本写为一个短的(2个字节),而没有第一个字节区分OK或错误响应。因为版本很小(可能是31),所以它被写为带有两个字节的
,因此您的
version
变量具有正确的值。使用
代替:)

但这不是问题所在,你所问的是OrientDB相关的,不涉及长生不老药。OrientDB总是在客户端连接时将
-1
作为会话id发送回,因此您看到的行为是预期的。此外,始终会返回令牌(无论您是否说想要它):如果您不想要它,则返回一个空令牌。如果您要求它,它可能仍然是空的(这意味着服务器不支持基于令牌的身份验证)

您必须在连接时发送会话id
-1
(实际上是一个负整数),因为您仍然没有会话id,是的,如果会话id不存在,则传递正会话id将导致TCP连接断开

因此,您没有做错什么:)您得到的响应将类似于:

<<0, 255, 255, 255, 255, 0, 0, 32, 102, 0, 0, 0, 0>>

这意味着:

  • 0
    -正常响应
  • -1
    作为int32)-由于新连接,会话id为-1
  • 8294
    作为int32)-新会话的会话id,您必须将其用于同一连接上的后续请求
  • -令牌(在本例中为空,因为
    0
    int32是令牌字节的长度)

总之,用Elixir编写的OrientDB二进制驱动程序将在未来几天内开源(我知道,因为我写了:p),仅供参考。

您发送的数据中的字段顺序正确。令人痛心的是,当您执行
操作时,您得到的是正确的版本,这有点运气不好,因为OrientDB在连接时只将版本写为一个短的(2个字节),而没有第一个字节区分OK或错误响应。因为版本很小(可能是31),所以它被写为带有两个字节的
,因此您的
version
变量具有正确的值。使用
代替:)

但这不是问题所在,你所问的是OrientDB相关的,不涉及长生不老药。OrientDB总是在客户端连接时将
-1
作为会话id发送回,因此您看到的行为是预期的。此外,始终会返回令牌(无论您是否说想要它):如果您不想要它,则返回一个空令牌。如果你要它,它可能仍然是空的(m