【问题标题】:C++ sending structure via UDP socketsC++ 通过 UDP 套接字发送结构
【发布时间】:2013-03-01 19:48:26
【问题描述】:

我正在尝试通过 UDP 套接字发送结构,我收到了正确的 DRB_count 值,但无法接收 KenbStar 的值。我究竟做错了什么?我正在使用同一台机器,在客户端和服务器中使用相同的端口环回 ip 127.0.01。

客户:

typedef struct tseTargetCellInformation{
   UInt8 DRB_count;                     
   UInt8 *KenbStar;
}tTargetCellConfiguration;

trecTargetCellConfiguration *rx_TargetCellConfiguration_str;

rx_TargetCellConfiguration_str = (trecTargetCellConfiguration*)malloc(sizeof(trecTargetCellConfiguration));

send_TargetCellConfiguration_str->DRB_count=1;
send_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1);
send_TargetCellConfiguration_str->KenbStar[0]= 0x5b;

sendto(sd, (char *) (send_TargetCellConfiguration_str), sizeof(tTargetCellConfiguration), 0, (struct sockaddr *)&server, slen)

服务器:

typedef struct tseTargetCellInformation{
   UInt8 DRB_count;                     
   UInt8 *KenbStar;
}tTargetCellConfiguration;

rx_TargetCellConfiguration_str->KenbStar = (UInt8*) malloc(1);

recvfrom(sd, (char *) (rx_TargetCellConfiguration_str), sizeof(trecTargetCellConfiguration), 0, (struct sockaddr*) &client, &client_length);

【问题讨论】:

  • 这根本不像C++

标签: c++ sockets udp structure


【解决方案1】:

因为KenbStar 是一个指针,所以您必须dereference 才能发送它指向的值或接收该值。否则,您只是发送和接收 指针(即,不是指向的内容),这通常毫无意义(尤其是如果客户端和服务器是不同的进程)。

换句话说,类似于:

sendto(sd, (char *) send_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ...

recvfrom(sd, (char *) rx_TargetCellConfiguration_str->KenbStar, sizeof(UInt8), ...

然而,让KenbStar 成为普通成员可能是最简单的,就像DRB_count 一样,除非你有特定的理由为什么它必须是一个指针。然后,您只需一次调用即可发送(和接收)整个结构。

【讨论】:

  • 谢谢,它起作用了,但仅适用于指针变量,结构中的其余变量呢。我有以下 str 通过 UDP 发送。我该怎么办?
  • 如果您的值分散在内存中(即不连续),那么您需要多次 sendto 调用。通常,最好将所有数据收集在一个连续的块中(一个只有值的单个结构,即没有指针),然后通过一次调用发送(和接收)。
【解决方案2】:

你不能将一个指向一个内存空间的指针发送到另一个内存空间并期望它指向同一个东西,尤其是当你没有发送它所指向的东西时。由于大约十个其他原因,通过网络发送未编码的结构是一个禁忌。您需要研究一些表示层,例如 XDR。

【讨论】:

  • 你能给我一些链接,我可以在其中找到这个主题,我想你在谈论编码 str,然后在套接字上发送它,然后在另一端解码
  • 您可以像我一样使用 Google XDR,这应该会引导您找到更现代的替代方案。
  • 我尝试使用 XDR 库对消息进行编码,然后通过套接字对其进行解码,但在解码端我得到了一些不需要的字符,然后是我的解码消息。我这样做:
  • char buffer[34] = "这是来自客户端的消息"; xdrmem_create(&xdrs, 缓冲区, 34, XDR_ENCODE); xdrmem_create(&xdrs, buffer1, 34, XDR_DECODE); printf("buffer::%s\n",buffer1);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2016-01-11
  • 2017-04-24
  • 2010-11-22
  • 2015-01-02
相关资源
最近更新 更多