8 バイトのパケットを消費して生成するデバイス用の単純な TCP クライアントを作成しました (send-command-receive-result 関数のコードは以下にあります)。
Linuxで実行すると、ループ(send-recv-send-recv-...)の一部として完全に機能しますが、Windowsではデバイスから最初のメッセージのみを受信します(send-recv-send-send-. ..)。パケットはまだ進行中です - Wireshark ではっきりと見ることができました - しかし、クライアントの下の何かがそれらを無視します (またはゼロに切り捨てますか?)。印刷さえしません"Data was read!"
-読み取りがスタックし、timeout
関数によって強制終了されたように見えます。
それ以前は、ソケットを直接使用していました。yeldedに変更してHandleStream
もまったく違いはありません。ラッピングも何もしませんでしたmain
。withSocketsDo
transmit :: Int -> HandleStream ByteString -> ByteString -> IO [Bytestring]
transmit delay sock packet = do
let input = timeout delay $ sock `readBlock` 8 <* putStrLn "\nData was read!"
sock `writeBlock` pack
strings <- whileJust input
return [str | Right str <- strings]
whileJust action = do
result <- action
case result of
Just a -> (:) <$> return a <*> whileJust action
Nothing -> return []
私は何を間違っていますか?