recvfrom 如何知道何时停止读取数据包?

How does recvfrom know when to stop reading packets?

在 C 中 recvfrom 可用于从套接字读取 UDP 消息,如下所示:

int length = recvfrom(socket, buffer, max_length, 0, NULL, 0);

max_length 只告诉缓冲区可以容纳的最大字节数,当然不是实际长度。

假设我的消息如下,并使用 sendto:

发送
char *message = "hi";
sendto(sock, message, strlen(message), 0, NULL, 0);

现在recvfrom会在接收到i字符后立即停止阅读。 length 将设置为 2。 它怎么知道什么时候停止?

是否 sendto 将任何数据附加到数据包中,strlen 的结果说明数据长度是多少?还是寻找空终止字符?

与基于流的 TCP 套接字不同,UDP 套接字是基于数据报的。

这意味着对 sendto 的单个调用将发送一个 UDP 数据报,对 recvfrom 的单个调用将接收单个 UDP 数据报。这也意味着提供给 recvfrom 的缓冲区应该足够大以容纳单个数据报。如果它不够大,则该数据报中不适合缓冲区的任何字节都将被丢弃。