首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smalltalk的ReadWrite流"atEND“评估无效

Smalltalk的ReadWrite流"atEND“评估无效
EN

Stack Overflow用户
提问于 2013-04-08 23:10:16
回答 2查看 143关注 0票数 2

我正在评估以下代码块:

代码语言:javascript
复制
[byteStream atEnd] whileFalse: [stream nextPut: self parsePacket] 

问题是我的“byteStream”是一个ReadWrite流,在它的末尾(我检查它的位置=读限制=写限制= 512),我的循环不会停止,就像:“byteStream atEnd”没有作用一样。我在linux下使用的是UDP 7.9.1,我的byteStream是通过UDP Socket提供的。欢迎任何帮助。

以下是服务器代码:

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
parse
^ Array streamContents: [:stream |
    [byteStream atEnd] whileFalse: [stream nextPut: self parsePacket] 
        ]

在解析方法中的循环,是问题所在吗,我在windows xp 32位上尝试了代码,它工作得很好,但在linux 32位上却不行,我想它与OS UDP网络有关?

EN

回答 2

Stack Overflow用户

发布于 2013-04-10 17:32:31

我找到了问题的来源。我使用一个解析OSC包大小的方法来调整缓冲区的大小,但是这个方法有问题,它每次都会将"0“作为位置发送到缓冲区。因此,每次循环在其初始位置找到缓冲区,然后继续循环,这是符合逻辑的。谢谢你的帮助。

票数 1
EN

Stack Overflow用户

发布于 2013-04-09 21:47:21

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15882682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档