Smalltalk的ReadWrite流"atEND"评估没有效果



我正在计算以下代码块:

[byteStream atEnd] whileFalse: [stream nextPut: self parsePacket] 

问题是我的"字节流"是一个读写流,是在它的结束,(我检查它和位置=读限制=写限制= 512)和我的循环不停止,就像如果:"[byteStream atEnd]"没有效果。我使用的是VisualWorks 7.9.1,在linux下,我的字节流是通过UDP套接字提供的。欢迎任何帮助。

服务器代码:

listenOnPort: aPort
| server peerAddr |
self initialize.
server := SocketAccessor newUDPserverAtPort: aPort.
peerAddr := IPSocketAddress hostName:'localhost' port: aPort.
process := 
        [
        [| buf sizeOfBuf |
        buf := String new: 2048.
        sizeOfBuf := server bufferSize.
        sizeOfBuf > 0
            ifTrue: 
                [| dataStream |
                server readWait.
                server receiveFrom: peerAddr buffer: buf.
                dataStream := ReadStream on: buf from: 1 to: sizeOfBuf.
                dataStream reset.
                self receive: dataStream]]
                repeat.]
                fork.

下面是解析缓冲区中包含的内容的代码:

parse
^ Array streamContents: [:stream |
    [byteStream atEnd] whileFalse: [stream nextPut: self parsePacket] 
        ]

解析方法中的循环,是问题,我尝试了windows xp 32位的代码,它工作得很好,但在linux 32位它没有,我认为它与操作系统UDP网络有关?

我找到问题的来源了。我用一个解析OSC BUNDLE大小的方法来调整缓冲区的大小,但是这个方法是错误的,它每次都向缓冲区发送"0"作为位置。所以每次循环都会在初始位置找到缓冲区,然后继续循环,这是合乎逻辑的。谢谢你的帮助。

"循环继续"是什么意思?显然,它不能继续读取不存在的数据包。由于您对缓冲区大小进行了硬编码限制,因此是否有可能在缓冲区的末尾有一个未完成的数据包,因此它无法读取其余部分?

最新更新