C++ 为什么winsock没有64位API?

C++ 为什么winsock没有64位API?,c++,c,tcp,64-bit,winsock2,C++,C,Tcp,64 Bit,Winsock2,Winsock API中的调用,如send()和sendto(),使用一个原始int来指定其缓冲区参数的大小。这显然对可能发送的最大缓冲区大小设置了32位限制 为什么会这样?是否有64位Winsock2 API可以使用更合适的大小类型(例如size\u t) 在Linux上,类似的调用使用size\t类型来定义大小。不需要更大的函数,实际上该类型可能很短,但仍然不会有问题 套接字不发送消息,它们只传输字节。调用send()时,recv()调用可能无法在一个块中接收数据。在接收字节时,必须实现逻辑

Winsock API中的调用,如
send()
sendto()
,使用一个原始int来指定其缓冲区参数的大小。这显然对可能发送的最大缓冲区大小设置了32位限制

为什么会这样?是否有64位Winsock2 API可以使用更合适的大小类型(例如
size\u t


在Linux上,类似的调用使用
size\t
类型来定义大小。

不需要更大的函数,实际上该类型可能很短,但仍然不会有问题


套接字不发送消息,它们只传输字节。调用send()时,recv()调用可能无法在一个块中接收数据。在接收字节时,必须实现逻辑,以了解是否全部获得,如果没有,则再次调用recv()。所以如果你想发送大于整数的东西?只需多次调用send()。如果你的recv()代码不能处理这个问题,那就是一个bug,因为它应该处理。

你想在一次调用中发送超过4GB的数据吗?!FWIW并非所有平台上的
int
大小都是4字节,尽管在使用visual studio的windows上可能是这样,因为发送大于2G字节的消息是不常见的需要。在不同的非windows平台上,这些调用使用
int
无符号int
作为大小类型,但这已更改。在Windows上更改大小类型将破坏现有应用程序的二进制兼容性。这个问题似乎来自对套接字工作原理的错误理解。即使使用1MB调用send(),另一端对recv()的调用可能会收到从1字节到完整1MB的任何内容,并且可能需要再次调用recv()。编程套接字时,您必须告诉接收者要接收多少或使用一个标记作为结束。所以你看,当发送数据时,通过多个电话发送数据不是问题。
send()
sendto()
在一次调用中发送的字节数不太可能超过套接字缓冲区所能容纳的字节数,套接字缓冲区远远小于2 GiB。数据传输大小也可能受到各种其他因素的限制。调用这些函数的用户代码必须检查实际发送了多少字节,并准备好使用多个调用发送多个字节,除非它实际上并不关心发送了多少数据。是的,这在Linux上不同的唯一原因是send/recv基本上是写/读的。@Fredrik-我非常了解套接字的工作原理,但感谢您的更新:)问题是为什么API从未更改为支持64位接口。这导致了无数的“警告C4267:'参数”:从“大小”转换为“…”,从更高级别层调用时可能出现“数据丢失”错误。