Indy WriteLn 和 ReadLn 字符串的最大长度是多少?

Posted

技术标签:

【中文标题】Indy WriteLn 和 ReadLn 字符串的最大长度是多少?【英文标题】:What is Indy WriteLn and ReadLn string max length? 【发布时间】:2022-01-19 13:24:14 【问题描述】:

使用 Indy 方法 WriteLnReadLn 发送和读取的字符串长度是否有限制?

【问题讨论】:

【参考方案1】:

TIdIOHandler.WriteLn() 仅受可用内存限制。但是,请注意,它将EOL (#13#10) 附加到输入字符串的末尾,生成一个作为原始副本的新字符串,然后将该副本转换为TIdBytes 以进行发送。因此,将使用更多的内存,而不仅仅是您传入的内存。我相信这在未来可以得到更好的优化。

TIdIOHandler.ReadLn() 有一个可选的AMaxLineLength 参数,默认设置为-1。如果设置为< 0,则将使用TIdIOHandler.MaxLineLength 属性,默认设置为16384 字节。如果需要,您可以将(A)MaxLineLength 设置得更高,或者您甚至可以将其设置为0 以完全禁用限制。如果(A)MaxLineLength 设置为> 0 并且传入的数据超过该限制,则后续行为取决于TIdIOHandler.MaxLineAction 属性:

maException(默认值):引发EIdReadLnMaxLineLengthExceeded,接收到的字节将保留在TIdIOHandler.InputBuffer 中以供后续读取。

maSplit:精确的(A)MaxLineLength字节数将从TIdIOHandler.InputBuffer中提取并作为String返回,TIdIOHander.ReadLnSplit属性将设置为True。剩余字节将保留在TIdIOHandler.InputBuffer 中以供后续读取。

【讨论】:

感谢您准确详细的回复。我还有一个问题,不知道要不要再开个帖子:TCPClient->IOHandler->MaxLineLength = 0;TCPClient->Socket->MaxLineLength = 0;有什么区别?我的意思是:使用SocketIOHandler 之间的区别。看来我可以在同一个地方以同样的方式使用两者。 @user3680100 "[IOHandler] 和 [Socket] 有什么区别?" - 当IOHandler 被分配一个TIdIOHandlerSocket 派生对象时,@987654352 @ 设置为同一个对象,否则设置为nil。所以Socket 只是一个快捷方式,可以避免在需要访问特定于套接字的功能时必须对IOHandler 进行类型转换。 当我设置TCPClient->IOHandler->MaxLineLength = 0;TCPClient->Socket->MaxLineLength = 0; 我得到错误Project CMRemoteViewer.exe raised exception class $C0000005 with message 'access violation at 0x0041b484: write of address 0x000000b8'. 对不起.....我搞砸了 cmets....不知道要删除什么而不造成其他损害...我道歉 我发现错误:设置属性MaxLineLength时TCPClient未连接

以上是关于Indy WriteLn 和 ReadLn 字符串的最大长度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE8报错:There is no overloaded version of 'ReadLn' that can be called with these argume

在linux中write和writel的区别

Indy10 Tcp接收数据问题

Indy,如何知道所需缓冲区的大小?

控制台程序设计

delphi枚举类型值的问题