在阅读了一些相关问题后,我决定使用 tpl library 来序列化我的结构,以便通过套接字发送和接收它们。我无法理解如何使用套接字发送和接收 tpl 图像。当我调用 tpl_dump
函数时,服务器端出现段错误错误。
我知道套接字在两端都在工作,因为我之前使用代码来回发送字符串。我还可以使用 tpl 在客户端上创建和读取 tpl 图像,没有任何问题。
这不是我最终想要来回发送的结构,但我希望弄清楚这个样本,以便我将来可以做到这一点。我知道我在传入缓冲区和 tpl_dump
之间处理不当。我仍在学习 C(正如我之前的问题所证明的那样),所以如果我的代码中有明显的错误,我深表歉意。
编辑
Nikolai 指出的问题已在下面的代码中得到纠正。然而,服务器代码记录 error: tpl_load to non-root node
并且仍然在 tpl_unpack(tn, 0);
处出现段错误
客户代码:
tpl_node *tn;
void *addr;
size_t len;
struct ci {
char c;
int i;
};
struct ci sample = {'a', 1};
tn = tpl_map("S(ci)", &sample); /* pass structure address */
tpl_pack(tn, 0);
tpl_dump(tn, TPL_MEM, &addr, &len );
tpl_free(tn);
send(sockfd, addr, len, 0);
服务器代码:
if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) {
//error handling
} else {
tpl_node *tn;
struct ci {
char c;
int i;
};
struct ci recieve;
tpl_map("S(ci)", &recieve);
tpl_load(tn, TPL_MEM, &buf, &nbytes );
tpl_unpack(tn, 0);
tpl_free(tn);
如果这会派上用场 - tpl user's guide
最佳答案
看起来你在滥用 tpl_dump
,至少在客户端 - 第二个参数应该是 void**
,而不是 int*
。宏将分配的缓冲区的地址存储到您的 addr
整数中,因此您正在向服务器发送地址(加上一些垃圾),而不是数据。服务器端的调用顺序也看起来乱七八糟。
仔细查看您的来源:
buf
和 len
中删除&符号(&); tpl_load
需要 void*
和 size_t
;free()
;这是一个没有套接字的简单完整示例:
#include <stdlib.h>
#include <stdio.h>
#include "tpl.h"
int main( int argc, char* argv[] )
{
char* buffer;
size_t i, len;
tpl_node *tn;
struct ci { char c; int i; } s = {'a', 1}, s1;
printf( "input {%c,%d}\n", s.c, s.i );
tn = tpl_map( "S(ci)", &s ); /* pass structure address */
tpl_pack( tn, 0 );
tpl_dump( tn, TPL_MEM, &buffer, &len );
tpl_free( tn );
printf( "size = %lu\n", len );
tn = tpl_map( "S(ci)", &s1 );
tpl_load( tn, TPL_MEM, buffer, len );
tpl_unpack( tn, 0 );
tpl_free( tn );
free( buffer );
printf( "output {%c,%d}\n", s1.c, s1.i );
return 0;
}
关于c - 使用 tpl 通过套接字发送结构以使用 c 进行序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1039049/