所以我试图使用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"什么的。
我觉得发送标题的唯一方法就是发送所有信息的结构。正确?
答案 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
float
len
指向的块的长度c
len
个字节代表c