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
的缓冲区应该足够大以容纳单个数据报。如果它不够大,则该数据报中不适合缓冲区的任何字节都将被丢弃。
在 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
的缓冲区应该足够大以容纳单个数据报。如果它不够大,则该数据报中不适合缓冲区的任何字节都将被丢弃。