2

ハンドル上のすべてのデータを読み取り、さらにデータを待つのをブロックしたいと思います。ストリームに「\n」文字があると、listen1は停止します。listen2は機能し、hGetNonBlockingのコードを模倣することで完全に一般化できます。これを行うための最良の方法は何ですか?

import qualified Data.ByteString as B

loop = sequence_ . repeat

listen1 :: Handle -> TChan B.ByteString -> IO()
listen1 sock chan = do
  loop ( do
         s <- B.hGetLine sock
         atomically (writeTChan chan s)
       )

listen2 :: Handle -> TChan B.ByteString -> IO()
listen2 sock chan = do
  loop ( do
         s <- B.hGet sock 1
         s1 <- B.hGetNonBlocking sock 65000
         atomically (writeTChan chan (B.append s s1))
       )
4

1 に答える 1

1

おそらくあなたは気づいていないか、私があなたの目標を誤解しているかもしれませんが、network-bytestringはすでにあなたが望んでいることを実行します。

于 2010-05-23T21:35:37.190 に答える