在阅读了一些相关问题后,我决定使用 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 整数中,因此您正在向服务器发送地址(加上一些垃圾),而不是数据。服务器端的调用顺序也看起来乱七八糟。
仔细查看您的来源:

  • buflen 中删除&符号(&); tpl_load 需要 void*size_t
  • 完成后你需要对内存进行 free()
  • 您需要注意短套接字读取 - 您可能会比从 TCP 套接字发送的读取更少(或更多)。

  • 这是一个没有套接字的简单完整示例:
    
    #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/

    10-11 09:23
    查看更多