【发布时间】:2016-08-12 07:00:35
【问题描述】:
我正在使用 tcp 连接将数据发送到 c++ 服务器。我读过 ei 库,当给定一个二进制文件时,它有一堆函数可以从二进制文件中获取解码值。例如,ei_decode_string、ei_decode_long 等。
我正在尝试做这些简单的事情:
1.创建一个套接字并连接到它。
{ok, Socket} = gen_tcp:connect({127,0,0,1}, 8986, []).
2。使用 gen_tcp:send/2 发送数据。
gen_tcp:send(Socket, term_to_binary("Stackoverflow")).
因此,我将二进制格式的字符串发送到服务器。
我的服务器,C++ 代码,获取数据,我正在尝试使用 ei_decode_string 获取客户端通过套接字发送给我的任何内容,例如:
理想情况下,解码时我应该取回字符串“Stackoverflow”,因为我告诉它从二进制文件中 decode_as_string。确保结果缓冲区中有足够的空间。
char *p = (char*)malloc(sizeof(char) * 100);
int index = 0;
int decoded = ei_decode_string(buff, &index, p);
cout<<"The decoded value is "<<p<<endl;
我无法解码我发送的字符串。!我错过了什么吗?如果这不是正确的方法,我如何在服务器端发送数据并对其进行解码。
感谢您的帮助!
【问题讨论】:
-
想通了,但这只是一周的时间。我可以看到在服务器端,我收到了一个额外的问号(?),如果我通过缓冲区跳过该字符,ei_decode_string 工作正常。但不确定,为什么我会得到那个额外的问号(?)。
-
我想和
binary_to_list(term_to_binary("Stackoverflow"))一样的原因不能按预期工作 -
为了得到正确、明确的答案:如果想将字符串转换为表示该字符串字符的二进制,则应使用
list_to_binary/1。当收件人需要Erlang external term format 中的数据时,应使用term_to_binary。 -
确保使用 gen_tcp:connect(SomeHost, 8986, [binary, {packet, 0}])。 packet 选项指定多少字节表示数据包长度,这可能会添加您收到的额外字符。