好吧,甚至Embarcadero都声明不能保证返回准备好要在套接字缓冲区中读取的字节的准确结果,但是如果您查看它,则将-1放在Socket.ReceiveBuf时(这就是ReceiveLength包装的内容)它使用FIONREAD调用ioctlsocket来确定可从套接字s读取的网络输入缓冲区中的未决数据量。

那么,这怎么不安全或不好?

例如:ioctlsocket(Socket.SocketHandle, FIONREAD, Longint(i));

最佳答案

您提到的文档专门说(重点是我的)


注意:对于流套接字连接,不保证ReceiveLength是准确的。


这意味着长度是未知的,因为它是由数据流提供的。显然,如果您不知道提前发送的数据量太大,则无法正确设置客户端应期望的长度。

将其视为复制文件的通用代码。如果您事先不知道将要复制的文件大小,则无法预测要复制的字节数。对于套接字,提供套接字的流大小是事先未知的(例如,对于实时生成和发送的数据),因此无法通知客户端套接字期望多少。

关于delphi - 为什么使用Socket.ReceiveLength不安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15536772/

10-12 17:10