gpt4 book ai didi

c - sendto()函数中发送一个结构体——C语言

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:51 26 4
gpt4 key购买 nike

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

sendto() 函数的原型(prototype)是这样的:

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

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

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

“消息由“HEADER”和“PAYLOAD”组成。

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

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”之类的。

我觉得发送 header 的唯一方法是发送所有信息的结构。对吧?

最佳答案

您可以使用 sendto 发送任何连续的内存块,因此没有指针的 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
};

当您需要发送这样的结构时,您可以在发送方将它们“序列化”为一个字节数组,接收端可以将其“反序列化”,然后发送该缓冲区。接收此缓冲区的代码将数据“解包”为“结构”,根据需要分配内存,并将数据从接收缓冲区复制到新分配的内存中。

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

  • 4 个字节用于 int
  • 4 个字节用于float
  • 4个字节表示指针c所指向的 block 的长度len
  • len 字节表示c
  • 的内容

关于c - sendto()函数中发送一个结构体——C语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26455284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com