【问题标题】:encode and send data with ASN.1使用 ASN.1 编码和发送数据
【发布时间】:2014-05-12 00:45:27
【问题描述】:

我想使用套接字将 int 从客户端发送到带有 ASN.1 的服务器。这是 ASN 定义

Message01 ::= SEQUENCE
        {
          number INTEGER  -- inital integer
        }

这是C代码

INTEGER_t clientNumber;
    printf("Enter a number :\n  "); 
    scanf("int *",&clientNumber);
    Message01_t *message1;

    message1 = calloc(1, sizeof(Message01_t));
    message1->number = clientNumber;
      der_encode(&asn_DEF_Message01, message1, 1, 0);

der_encode 出现错误

警告:传递“der_encode”的参数 3 使指针来自整数 没有强制转换 client.c:117:错误:分配中的类型不兼容

example ASN.1的例子中他们写了

der_encode(&asn_DEF_Rect, rect,write_stream, ostream);

但我不明白 write_stream 是什么。

编辑:

我试过了

static int
write_out(const void *buffer, size_t size, void *app_key) {
     FILE *out_fp = app_key;
    size_t wrote;
    wrote = send( to_server_socket, &buffer, sizeof( buffer ), 0 );

    return (wrote == size) ? 0 : -1;
}

int main ( int argc, char* argv[] )

der_encode(&asn_DEF_Message01, message1, write_out, 0);

但我有一个错误

ndefined symbols for architecture x86_64:
  "_asn_DEF_Message01", referenced from:
      _main in cccwTrYO.o
  "_der_encode", referenced from:
      _main in cccwTrYO.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

【问题讨论】:

    标签: c asn.1


    【解决方案1】:

    哇,这个文档太糟糕了。但是“矩形”示例中有一个线索...

    /*
     * This is a custom function which writes the
     * encoded output into some FILE stream.
     */
    static int
    write_out(const void *buffer, size_t size, void *app_key) {
        FILE *out_fp = app_key;
        size_t wrote;
    
        wrote = fwrite(buffer, 1, size, out_fp);
    
        return (wrote == size) ? 0 : -1;
    }
    

    然后

    ec = der_encode(&asn_DEF_Rectangle, rectangle, write_out, fp);
    

    我由此推断write_stream 参数应该是您编写的回调函数,而ostream 参数应该是应用程序提供的数据,它被逐字传递给回调。这是 C 语言中非常常见的回调模式。

    因此,您需要编写一个回调函数来写入您的网络套接字(使用writesend),将其提供为write_stream,并将套接字描述符编号作为ostream 传递。

    【讨论】:

    • 我尝试编写 write_stream 函数,但仍然遇到一些问题。我更新了我的帖子。
    • 您的新问题与您之前的问题无关;只是您需要告诉编译器链接到您正在使用的 ASN.1 库。 (如果您认为自己确实告诉了它,请将所有 -l 选项移到命令行的最末尾。)另外,花点时间重新阅读修改后的回调函数并仔细考虑它在做;我发现至少有两个潜在问题(不是会导致链接错误的问题,而是以后可能会困扰您的问题)。
    • 你的意思是这样吗?它不能解决问题:/ gcc -o client client.c -I../client/asn
    • 我对这个 ASN 库了解不多,无法确切知道您需要什么,但它可能类似于 -L../client/asn -lasn。注意-L-l-I是三个不同的东西;与往常一样,Unix 区分大小写。
    • 还是不行,在文档中他使用了 cc -I。 -o rencode *.c 但我仍然有错误。也许我写的函数是假的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2022-01-22
    • 2012-04-11
    相关资源
    最近更新 更多