【发布时间】:2020-07-10 18:26:17
【问题描述】:
Winsock API 中的 send() 和 sendto() 等调用采用原始 int 来指示其缓冲区参数的大小。这显然对可以发送的最大缓冲区大小设置了 32 位限制。
这是为什么?是否有可用的 64 位 Winsock2 API 可能使用更合适的大小类型(例如 size_t)?
在 Linux 上,类似的调用使用 size_t 类型来定义大小。
【问题讨论】:
-
您想在一次通话中发送超过 4GB 的数据?!
-
FWIW 在所有平台上
int的大小不一定是 4 字节stackoverflow.com/questions/589575/… 尽管在使用 Visual Studio 的 Windows 上就是这种情况docs.microsoft.com/en-us/cpp/cpp/data-type-ranges?view=vs-2019 -
大概是因为发送大于 2 GB 的消息并不常见。
-
在不同的非 Windows 平台上,这些调用曾经使用
int或unsigned int作为尺寸类型,但是这已经改变了。在 Windows 上,更改大小类型会破坏现有应用程序的二进制兼容性。 -
这个问题似乎来自对套接字如何工作的误解。即使您使用 1MB 调用 send(),对另一端的 recv() 的调用也可能会收到从 1 字节到完整 1MB 的任何内容,并且可能必须再次调用 recv()。在对套接字进行编程时,您必须告诉接收者要接收多少或使用结束标记。所以你看,在发送数据时,通过多次调用发送它们不是问题。