在sendto()函数中发送结构 - C语言

时间:2014-10-19 20:52:21

标签: c sockets network-programming sendto

所以我试图使用sendto()函数向客户端发送消息。

sendto()函数的原型如下:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

但我想发送一个结构作为第二个参数。我可以这样做吗?或者buf必须是一个字符串吗?

编辑:你知道,我必须能够发送这个:

"消息由" HEADER"然后是" PAYLOAD"。

您的邮件标题应包含以下内容:

uint8_t version; /* must be 1. If you receive anything else, discard*/
uint8_t ttl; /* must be 1. If you receive anything else, discard*/
uint16_t payload_length; /* bytes following the header */
uint32_t account_identifier; /* digits of your account name */
uint32_t source_address; /* unused for now, set to 0 and ignore. */
uint32_t destination_address; /* unused for now, set to 0 and ignore. */
uint16_t checksum; /* unused for now, set to 0 and ignore. */
uint16_t protocol; /* must be 1. If you receive anything else, discard*/"

有效负载是一个文本字符串,如" Hello"什么的。

我觉得发送标题的唯一方法就是发送所有信息的结构。正确?

1 个答案:

答案 0 :(得分:2)

您可以使用sendto发送任何连续的内存块,因此没有指针的struct就可以了。但是,客户端需要能够使用适当的布局处理struct,这是非常有限的。

考虑这样一个简单的struct

struct One {
    int a;
    float b;
    char c[20];
};

当使用相同的设置使用相同的编译器编译客户端和服务器代码时,它在同一硬件上工作正常。稍微不同的硬件即使对于这个看似简单的struct也会引起问题,但是:字节顺序,填充,各种表示的大小等都将是相同的,以便它可以工作。

如果您需要与其他硬件或其他编程语言进行互操作,则需要生成双方都可以处理的特定结构,二进制或文本。

如果您的struct有指针,如果没有特殊处理,您将无法发送和接收它:

struct Two {
    int a;
    float b;
    char* c; // <<<=== Not going to work
};

当您需要发送类似的结构时,您可以&#34;序列化&#34;它们在发送方上成为一个字节数组,可以&#34;反序列化&#34;由接收端,并发送该缓冲区。接收此缓冲区的代码&#34;解包&#34;将数据放入`struct&#34;,根据需要分配内存,并将数据从接收缓冲区复制到这个新分配的内存中。

上面的struct可以序列化如下:

  • int
  • 的4个字节
  • float
  • 的4个字节
  • 4个字节,表示指针len指向的块的长度c
  • len个字节代表c
  • 的内容