将结构传递给C中的Sockets

我试图将整个结构从客户端传递到服务器,反之亦然。让我们假设我的结构如下

struct temp {
  int a;
  char b;
}

我使用sendto和发送结构变量的地址,并在另一边使用recvfrom函数接收它。但我不能得到在接收端发送的原始数据。在sendto函数中,我将接收到的数据保存到struct temp类型的变量中。

n = sendto(sock, &pkt, sizeof(struct temp), 0, &server, length);
n = recvfrom(sock, &pkt, sizeof(struct temp), 0, (struct sockaddr *)&from,&fromlen);

其中pkt是struct temp类型的变量。

Eventhough我收到8bytes的数据,但如果我尝试打印它只是显示垃圾值。任何帮助修复它?

注意:不需要使用第三方库。

编辑1:我真的是新的这个序列化概念..但没有做串行化我不能通过套接字发送一个结构?

EDIT2:当我尝试使用sendto和recvfrom函数发送字符串或整数变量时,我在接收端正确接收数据。为什么不是在结构的情况下?如果我不必使用序列化函数,那么我应该分别发送结构的每个成员?这真的不是一个合适的解决方案,因为如果有’n’数量的成员,那么有’n’行代码添加只是为了发送或接收数据。

这是一个很糟糕的主意。二进制数据应始终以以下方式发送:

>手柄不同endianness
>手柄不同padding
>处理byte-sizes of intrinsic types的差异

不要以二进制方式写整个结构,而不是写入文件,而不是写入套接字。

始终分别写入每个字段,并以相同的方式读取它们。

你需要有类似的功能

unsigned char * serialize_int(unsigned char *buffer, int value)
{
  /* Write big-endian int value into buffer; assumes 32-bit int and 8-bit char. */
  buffer[0] = value >> 24;
  buffer[1] = value >> 16;
  buffer[2] = value >> 8;
  buffer[3] = value;
  return buffer + 4;
}

unsigned char * serialize_char(unsigned char *buffer, char value)
{
  buffer[0] = value;
  return buffer + 1;
}

unsigned char * serialize_temp(unsigned char *buffer, struct temp *value)
{
  buffer = serialize_int(buffer, value->a);
  buffer = serialize_char(buffer, value->b);
  return buffer;
}

unsigned char * deserialize_int(unsigned char *buffer, int *value);

或者等效,当然有几种方法来设置这一点与缓冲区管理等。然后你需要做更高级的函数来序列化/反序列化整个结构。

这假定序列化是从/到缓冲区完成的,这意味着序列化不需要知道最终目的地是文件还是套接字。它也意味着你支付一些内存开销,但它通常是一个很好的设计,出于性能原因(你不想做一个write()每个值到套接字)。

一旦你有了上面的,以下是如何可以序列化和传输结构实例:

int send_temp(int socket, const struct sockaddr *dest, socklen_t dlen,
              const struct temp *temp)
{
  unsigned char buffer[32], *ptr;

  ptr = serialize_temp(buffer, temp);
  return sendto(socket, buffer, ptr - buffer, 0, dest, dlen) == ptr - buffer;
}

关于上述几点要注意:

>要发送的结构首先被逐个字段序列化,进入缓冲区。
>序列化例程返回一个指向缓冲区中下一个空闲字节的指针,我们用它来计算序列化的字节数
>显然,我的示例序列化例程不保护缓冲区溢出。
>如果sendto()调用成功,返回值为1,否则为0。

http://stackoverflow.com/questions/1577161/passing-a-structure-through-sockets-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:将结构传递给C中的Sockets