我为某些设备编写了一个简单的 TCP 客户端,它消耗并产生 8 字节的数据包(send-command-receive-result 函数的代码如下)。
当我在 linux 上运行它时,它运行良好,是循环的一部分(send-recv-send-recv-...),但在 windows 上它只接收来自设备的第一个 msg(send-recv-send-send-. ..)。数据包仍在传输——我可以用 Wireshark 清楚地看到它们——但我的客户端下的某些东西只是忽略了它们(或截断为零?)。它甚至不打印"Data was read!"
- 看起来阅读卡住并被timeout
功能杀死。
在此之前,我直接使用套接字;更改为HandleStream
yield 完全没有区别。包裹也没有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 []
我究竟做错了什么?