2

8 バイトのパケットを消費して生成するデバイス用の単純な TCP クライアントを作成しました (send-command-receive-result 関数のコードは以下にあります)。

Linuxで実行すると、ループ(send-recv-send-recv-...)の一部として完全に機能しますが、Windowsではデバイスから最初のメッセージのみを受信します(send-recv-send-send-. ..)。パケットはまだ進行中です - Wireshark ではっきりと見ることができました - しかし、クライアントの下の何かがそれらを無視します (またはゼロに切り捨てますか?)。印刷さえしません"Data was read!"-読み取りがスタックし、timeout関数によって強制終了されたように見えます。

それ以前は、ソケットを直接使用していました。yeldedに変更してHandleStreamもまったく違いはありません。ラッピングも何もしませんでしたmainwithSocketsDo

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 []

私は何を間違っていますか?

4

0 に答える 0