Я оцениваю следующий блок:
[byteStream atEnd] whileFalse: [stream nextPut: self parsePacket]
Проблема в том, что мой " byteStream ", который является потоком ReadWrite, находится в конце (я проверяю его и позиция = предел чтения = предел записи = 512), и мой цикл не останавливается, например, если: "[ byteStream atEnd]» не имело никакого эффекта. Я использую VisualWorks 7.9.1 под Linux, и мой 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]
]
Цикл в методе синтаксического анализа - это проблема, я попробовал код на 32-битной Windows XP, и он работает нормально, но на 32-битной Linux это не так, я думаю, это как-то связано с сетью UDP ОС?
byteStream
изparse
— это тот же поток, что иdataStream
изlistenOnPort:
, да? - person Dave Newman   schedule 09.04.2013