2

次のブロックを評価しています:

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

問題は、ReadWrite ストリームである「byteStream」が最後にあることです (私はそれを検査し、位置 = 読み取り制限 = 書き込み制限 = 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 32 ビットでコードを試してみましたが、正常に動作しましたが、Linux 32 ビットでは動作しません。OS UDP ネットワークと関係があると思いますか?

4

2 に答える 2

1

問題の原因がわかりました。OSC BUNDLE のサイズを解析する方法でバッファのサイズを変更していましたが、この方法には問題があり、毎回位置として「0」をバッファに送信していました。そのため、ループのたびに最初の位置でバッファが検出され、ループが続行されます。これは論理的です。ご協力ありがとうございました。

于 2013-04-10T09:32:31.050 に答える
0

「ループが続く」とはどういう意味ですか? 明らかに、そこにないパケットを読み続けることはできません。バッファサイズにハードコーディングされた制限を設定したため、バッファの最後に未完成のパケットがあり、残りのパケットを読み取ろうとして失敗する可能性はありますか?

于 2013-04-09T13:47:20.587 に答える