使用二进制协议尝试使用Elixir连接到OrientDB会返回无效的会话ID
我正在尝试使用Elixir(1.0.5)连接到OrientDB(2.1RC5)。两者都在我的本地计算机上运行,我编写了以下代码作为第一次尝试连接:使用二进制协议尝试使用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>>} ->
{: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
(
作为int32)-由于新连接,会话id为-1-1
(
作为int32)-新会话的会话id,您必须将其用于同一连接上的后续请求8294
-令牌(在本例中为空,因为
int32是令牌字节的长度)0
总之,用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
(
作为int32)-由于新连接,会话id为-1-1
(
作为int32)-新会话的会话id,您必须将其用于同一连接上的后续请求8294
-令牌(在本例中为空,因为
int32是令牌字节的长度)0
总之,用Elixir编写的OrientDB二进制驱动程序将在未来几天内开源(我知道,因为我写了:p),仅供参考。您发送的数据中的字段顺序正确。令人痛心的是,当您执行
操作时,您得到的是正确的版本,这有点运气不好,因为OrientDB在连接时只将版本写为一个短的(2个字节),而没有第一个字节区分OK或错误响应。因为版本很小(可能是31),所以它被写为带有两个字节的
,因此您的version
变量具有正确的值。使用
代替:)
但这不是问题所在,你所问的是OrientDB相关的,不涉及长生不老药。OrientDB总是在客户端连接时将-1
作为会话id发送回,因此您看到的行为是预期的。此外,始终会返回令牌(无论您是否说想要它):如果您不想要它,则返回一个空令牌。如果你要它,它可能仍然是空的(m