Smalltalk的ReadWrite流“atEND”评估无效

时间:2013-04-08 15:10:16

标签: stream udp smalltalk visualworks

我正在评估以下块:

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

问题是我的“byteStream”是一个ReadWrite流,它结束了(我检查它并且position =读取限制=写入限制= 512)并且我的循环没有停止,就好像:“[byteStream atEnd]”无效。 我在linux下使用VisualWorks 7.9.1,我的byteStream是通过UDP Socket提供的。 欢迎任何帮助。

这是服务器代码:

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 32bit上尝试了代码并且工作正常,但是在Linux 32bit上它没有,我认为它与OS UDP网络有关?

2 个答案:

答案 0 :(得分:1)

我发现了问题的来源。我正在使用解析OSC BUNDLE大小的方法调整缓冲区的大小,但是这种方法有问题,并且每次都向缓冲区发送“0”作为位置。所以每次循环找到缓冲区在其初始位置然后继续循环,这是合乎逻辑的。谢谢你的帮助。

答案 1 :(得分:0)

“循环继续”是什么意思?显然,它无法继续读取不存在的数据包。是否有可能因为你对缓冲区大小设置了一个硬编码限制,你在缓冲区的末尾有一个未完成的数据包,因此它无法尝试读取剩下的部分?