使用ASN.1编码和发送数据

时间:2014-05-11 13:42:05

标签: c asn.1

我想使用socket从客户端向使用ASN.1的服务器发送一个int。这是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使得指针来自整数   没有cast 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

1 个答案:

答案 0 :(得分: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提供,并将套接字描述符号作为{ {1}}。