gpt4 book ai didi

c - 抽象 UDP 和 TCP 发送/接收过程

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

美好的一天。

简介。

最近我开始研究一些“低级”网络编程以及 Linux 中的网络协议(protocol)。为此,我决定创建一个小型网络库。

现在我想知道一些问题。我现在就去询问其中一位。

如您所知,至少有两种协议(protocol)构建在 IP 之上。我讲的是TCP和UDP。由于其面向连接的属性,它们的实现在操作系统中可能有所不同。

根据man 7 udp,UDP 套接字上的所有接收操作仅返回一个数据包。这是合理的,因为不同的数据报可能来自不同的来源。

另一方面,TCP 连接数据包序列可以被视为连续的字节流。

现在,谈谈问题本身。

比如说,我有一个用于 TCP 连接套接字和 UDP 套接字的 API,例如:

void tcp_connection_recv(endpoint_t *ep, buffer_t *b);
void udp_recv(endpoint_t *ep, buffer_t *b);

endpoint_t 类型将描述端点(TCP 连接为远程端点,UDP 连接为本地端点)。 buffer_t 类型将描述某种基于 vector 或基于数组的缓冲区。

缓冲区很可能已经由用户分配,我不确定这是否适合 UDP 不更改缓冲区的大小。因此,为了抽象 TCP 和 UDP 操作的代码,我认为需要分配尽可能多的缓冲区来包含整个接收到的数据。另外,为了防止调整用户缓冲区的大小,每个套接字可能会映射到自己的缓冲区(尽管它将是用户空间缓冲区,但它将对用户隐藏)。然后,根据用户的请求,数据将从该“内部”缓冲区复制到用户的缓冲区,或者如果数量不足,则从套接字读取。

有什么建议或意见吗?

最佳答案

如果你想创建这样的API,这将取决于你想要提供的服务。在 TCP 中,它与 UDP 不同,因为 TCP 是面向流的。

对于TCP,tcp_connection_recv不是重新分配一个缓冲区,如果用户传递的缓冲区不够大,你可以填满整个缓冲区然后返回,也许带有一个输出参数,并指示还有更多数据等待发送被阅读。基本上你可以使用TCP连接在内核中已经提供的接收缓冲区,不需要创建其他缓冲区。

对于 udp,您可以向用户请求一个数字,指示其正在等待的最大数据报大小。当您使用 recvfrom 从 UDP 套接字读取数据时,如果读取的数据少于到达数据报中的数据,则数据报的其余数据将丢失。您可以首先使用 MSG_PEEK 标志进行读取,以了解有多少数据可用。

一般来说,我不会处理应用程序的缓冲区,因为应用程序(实际上是应用程序层协议(protocol))知道它期望如何接收数据。

关于c - 抽象 UDP 和 TCP 发送/接收过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33483831/

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