为什么使用Socket.ReceiveLength不安全?

时间:2013-03-20 23:32:23

标签: delphi winsock

嗯,即使Embarcadero声明也不能保证在套接字缓冲区中返回准确读取的字节的准确结果,但是如果你看一下,当你在Socket.ReceiveBuf中放置-1时(这个是ReceiveLength包装的东西)它用 FIONREAD 调用 ioctlsocket 来确定网络输入缓冲区中可以从套接字读取的待处理数据量

所以,这怎么不安全或不好?

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

1 个答案:

答案 0 :(得分:5)

您提到的文件具体说明(强调我的)

  

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

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

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