美好的一天。
简介
最近我开始研究一些低水平的'网络编程以及Linux中的网络协议。为此,我决定创建一个用于网络的小型库。
现在我想知道一些问题。我现在会问其中一个。
如您所知,至少有两种协议建立在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
类型将描述某种基于矢量或基于数组的缓冲区。
很可能用户已经分配了缓冲区,并且我不确定UDP是否适合不更改缓冲区的大小。因此,为了抽象TCP和UDP操作的代码,我认为它需要根据需要分配尽可能多的缓冲区来包含整个接收数据。 此外,为了防止调整用户缓冲区的大小,每个套接字可以被绑定到它自己的缓冲区(虽然它将是用户空间缓冲区,但它将被用户隐藏)。然后,用户的请求数据将从内部'内部复制。如果没有足够的数量,缓冲到用户的一个或从套接字读取。
有任何建议或意见吗?
答案 0 :(得分:1)
如果要创建此类API,则取决于您要提供的服务。在TCP中它将与UDP不同,因为TCP是面向流的。
对于TCP,tcp_connection_recv而不是重新分配缓冲区,如果用户传递的缓冲区不够大,可以填充整个缓冲区然后返回,可能带有输出参数,并指示有更多数据等待被阅读。基本上你可以使用TCP连接已经在内核中提供的接收缓冲区,不需要创建其他缓冲区。
对于udp,您可以向用户请求一个数字,表示它正在等待的最大数据报大小。当您从具有recvfrom的UDP套接字读取时,如果您读取的数据少于到达数据报中的数据,则其余数据报数据将丢失。您可以先读取MSG_PEEK标志,以了解可用的数据量。
一般情况下,我不会处理应用程序的缓冲区,因为应用程序实际上是应用程序层协议,它知道它希望如何接收数据。