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

Delphi 为什么使用Socket.ReceiveLength不安全?,delphi,winsock,Delphi,Winsock,好的,即使声明它也不能保证返回套接字缓冲区中准备读取的字节的准确结果,但是如果您查看它,当您在socket.ReceiveBuf处放置-1时(这就是ReceiveLength包装的内容)它使用FIONREAD调用ioctlsocket,以确定网络输入缓冲区中可从套接字读取的未决数据量 那么,它如何不安全或不好呢 e、 g:ioctlsocket(Socket.SocketHandle,FIONREAD,Longint(i))您提到的文档特别指出(我的重点) 注意:对于流式套接字连接,Receiv

好的,即使声明它也不能保证返回套接字缓冲区中准备读取的字节的准确结果,但是如果您查看它,当您在socket.ReceiveBuf处放置-1时(这就是ReceiveLength包装的内容)它使用FIONREAD调用ioctlsocket,以确定网络输入缓冲区中可从套接字读取的未决数据量

那么,它如何不安全或不好呢


e、 g:
ioctlsocket(Socket.SocketHandle,FIONREAD,Longint(i))

您提到的文档特别指出(我的重点)

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

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


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

您提到的文档特别指出(我的重点)

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

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


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

如果您包含指向where Embarcadero(或任何其他方)的链接,那就太好了陈述你所说的。@jachguate:我提供了链接。它来自
TCustomWinSocket
,实际上至少早在2007年的D2007年就出现了。如果您包含一个链接,指向Embarcadero(或任何其他方)陈述您所说内容的地方,那就太好了。@JachGrate:我提供了链接。它来自于
TCustomWinSocket
,实际上至少在2007年的D2007年就出现了。你说的很对,我可以发送8个字节,ReceiveLength只能看到4个字节,然后再得到4个字节。你说的很对,我可以发送8个字节,ReceiveLength只能看到4个字节,然后再得到4个字节。