2

我为某些设备编写了一个简单的 TCP 客户端,它消耗并产生 8 字节的数据包(send-command-receive-result 函数的代码如下)。

当我在 linux 上运行它时,它运行良好,是循环的一部分(send-recv-send-recv-...),但在 windows 上它只接收来自设备的第一个 msg(send-recv-send-send-. ..)。数据包仍在传输——我可以用 Wireshark 清楚地看到它们——但我的客户端下的某些东西只是忽略了它们(或截断为零?)。它甚至不打印"Data was read!"- 看起来阅读卡住并被timeout功能杀死。

在此之前,我直接使用套接字;更改为HandleStreamyield 完全没有区别。包裹也没有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