我为某些设备编写了一个简单的TCP客户端,它消耗并生成8字节数据包(send-command-receive-result函数的代码如下)。
当我在linux上运行它时,它完美地运行,作为循环的一部分(send-recv-send-recv -...),但在Windows上它只接收来自设备的第一个消息(send-recv-send-发送-...)。数据包仍在继续 - 我可以用Wireshark清楚地看到它们 - 但是我的客户端下的东西只是忽略它们(或截断为零?)。它甚至不打印"Data was read!"
- 看起来像是卡住了并被timeout
函数杀死。
在此之前,我直接使用了套接字;改为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 []
我做错了什么?