2

我正在评估以下块:

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

问题是我的“字节流”是一个读写流,在它的末尾,(我检查它并且位置=读取限制=写入限制=512)并且我的循环没有停止,例如:“[ byteStream atEnd]" 没有效果。我在 linux 下使用 VisualWorks 7.9.1,我的 byteStream 是通过 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 32bit 上尝试了代码,它工作正常,但在 linux 32bit 上却没有,我认为它与操作系统 UDP 网络有关?

4

2 回答 2

1

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

于 2013-04-10T09:32:31.050 回答
0

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

于 2013-04-09T13:47:20.587 回答