Skip to content

hWaitForInput causes the program to abort on Windows

When running the "server" and "client" progams shown below, the client aborts, on Windows (10), with the following error:

{loc=<socket: 380>,type=duplex (read-write),buffering=none}
fdReady: fd is too big
This application has requested the Runtime to terminate it in an unusual way.

Here is the code for the client:

import Network
import Control.Concurrent
import System.IO

main = readWithinNSecs

readWithinNSecs :: IO ()
readWithinNSecs = withSocketsDo $ do
  h <- connectTo "localhost" (PortNumber 9090)
  hSetBuffering h NoBuffering
  readerTid <- forkIO $ politeReader h
  threadDelay (2 * 10^6)
  killThread readerTid

  where
    politeReader h = do
      info <- hShow h
      putStrLn info
      gotSth <- hWaitForInput h (10^6)
      if gotSth
        then do
            line <- hGetLine h
            putStrLn $ "Got " ++ line
        else 
            return ()
 

And here the code for the server:

module Main where
 
import Network.Socket
import Control.Concurrent

main :: IO ()
main = do
    sock <- socket AF_INET Stream 0    -- create socket
    setSocketOption sock ReuseAddr 1   -- make socket immediately reusable - eases debugging.
    bind sock (SockAddrInet 9090 iNADDR_ANY)   -- listen on TCP port 4242.
    listen sock 2                              -- set a max of 2 queued connections
    mainLoop sock       

mainLoop :: Socket -> IO ()
mainLoop sock = do
    conn <- accept sock     -- accept a connection and handle it
    runConn conn            -- run our server's logic
    mainLoop sock           -- repeat
 
runConn :: (Socket, SockAddr) -> IO ()
runConn (sock, _) = do
    threadDelay (2 * 10^6)
    send sock "Hello!\n"
    close sock
Edited by dnadales
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information