gpt4 book ai didi

用于处理完整接收的 C 套接字

转载 作者:行者123 更新时间:2023-11-30 21:27:29 25 4
gpt4 key购买 nike

Beej 的套接字编程指南/教程提供了有关通过 send 发送所有数据的易于使用的代码片段。它称为 sendall 并在此处提供 - http://beej.us/guide/bgnet/html/single/bgnet.html#sendall

没有为 recv all 提供这样明确的指导,尽管声明 recv 也可以是部分的。为什么?

另外,我如何编写一个类似于sendall建议的非阻塞recvall函数。这看起来像是常见问题解答,尽管没有简单的答案。

最佳答案

你原来的想法行不通。如果 recv() 已读取发送的所有字节,则它会阻塞,除非发送更多字节。如果没有发送任何内容,您就会陷入困境。正如上面的评论者所说,您需要某种方法来判断何时到达传输结束。

有两种方法可供选择。最简单的方法是在发送完所有数据后关闭发送端的套接字。 recv() 将在适当的时候返回 0,您就知道您期望的所有数据都已到达。

另一种稍微困难的方法是在消息本身之前发送消息的长度。这很简单。在发送端(为简洁起见,省略了错误检查):

uint32_t msg_len = ...;
uint32_t network_byte_order_msg_len = htonl (msg_len);
int nbytes = sizeof (network_byte_order_msg_len);
sendall (skt, sizeof (uint32_t), &network_byte_order_msg_len, &nbytes);
nbytes = msglen;
sendall (skt, my_msg_buf, &nbytes);

在接收端,假设我们有一个函数 recv_bytes ,它会循环调用 recv 直到获得要查找的字节数:

uint32_t network_byte_order_msg_len;
int nbytes = sizeof (network_byte_order_msg_len);
recv_bytes (skt, &network_byte_order_msg_len, nbytes);
int msg_len = ntohl (&network_byte_order_msg_len);
void *msg_buf = malloc (msg_len);
nbytes = msg_len;
recv_bytes (skt, msg_buf, &nbytes);

请注意,通过这种方式,我们可以立即在接收器中分配正确大小的消息缓冲区,这是很好且高效的。

您可以编写recv_bytes()吗?如果您愿意,可以将实现编辑到我的帖子中,以供将来的访问者使用。

编辑:该代码是 C++,我相信您可以修复它。

关于用于处理完整接收的 C 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788713/

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