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

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

【问题讨论】:

    标签: sockets indy10


    【解决方案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;有什么区别?我的意思是:使用Socket 和IOHandler 之间的区别。看来我可以在同一个地方以同样的方式使用两者。
    • @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未连接
    猜你喜欢
    • 2010-12-16
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2010-10-23
    • 2016-09-11
    相关资源
    最近更新 更多