我怎样才能获得有关Network.Socket {.ByteString}的信息/示例?

时间:2011-08-20 16:55:22

标签: networking haskell

我在网络库中玩了一点,“简单”形式,使用相当简单:'listenOn','connectTo','accept'的组合,我们有一些工作。现在我正在尝试使用“真实”的东西,意思是Network.Socket和Network.Socket.ByteString,因为我想在客户端和服务器之间发送文件。但它不像更高级别的界面那么容易使用,我正在寻找一些代码示例和/或方法。特别是,处理'getAddrInfo','AddrInfo'和'SockAddr'的代码我不是很了解。
那么,我在哪里可以获得这种类型的资源呢?

3 个答案:

答案 0 :(得分:1)

Network.Socket.ByteString模块的documentation底部有一个示例。

答案 1 :(得分:1)

.Socket接口只不过是绑定到berkeley套接字,我建议你阅读Beej的网络编程指南(对于C)来处理这个问题。

编辑:“稍微多一点”的分析工具并非旨在减少在所有支持的平台上平滑配置,构建和安装此层的工作量。我只是说很多.Socket操作和C基元的man(3)页面之间基本上是一对一的关系。

答案 2 :(得分:0)

我可以展示一个自己的例子:

import Network.Socket
  ( SocketType(..), AddrInfo(..), AddrInfoFlag(..), Family(..), socket, sClose, 
    defaultHints, withSocketsDo, connect, getAddrInfo, defaultProtocol )
import Network.Socket.ByteString( sendAll, recv )
import qualified Data.ByteString.Char8 as BC( readFile, hPut, null )

sendFile :: String -> Int -> FilePath -> IO Bool
sendFile server port filename = withSocketsDo $ do
  addrinfos <- getAddrInfo desiredAddr (Just server) (Just . show $ port)
  if null addrinfos
    then do
      return False
    else do
      datafile <- BC.readFile filename
      let serveraddr = head addrinfos
      sock <- socket (addrFamily serveraddr) Stream defaultProtocol
      connect sock (addrAddress serveraddr)
      sendAll sock datafile
      sClose sock
      return True

我不测试(只是从我的代码文件中删除)所以可能导入失败。在我使用的服务器上:

readerThread :: MyQueue -> Socket -> IO ()
readerThread queue serverSock = do
  (connsock, clientaddr) <- accept serverSock
  sClose serverSock
  putStrLn $ "> connected reader " ++ show clientaddr
  talk connsock
  sClose connsock
  putStrLn $ "> closed reader " ++ show clientaddr
  return ()
    where
      talk conn = do 
        msg <- recv conn 2048
        putStr $ "* get from " ++ show conn ++ "\n"
        myQueueWrite queue msg
        unless (B.null msg) $ do 
          talk conn

createInputPort :: ChildLocks -> MyQueue -> AddrInfo -> IO PortNumber
createInputPort children obuffer serverAddr = withSocketsDo $ do
  serverSock <- socket AF_INET Stream defaultProtocol
  bindSocket serverSock (addrAddress serverAddr)
  listen serverSock 1

  lock <- newChildLock children
  _ <- forkIO $ readerThread obuffer serverSock `finally` endChildLock lock
  socketPort serverSock

Y使用自己的队列(TCHAN)在网络阅读器和消费者线程之间进行通信,并使用childLocks在最后等待我在stackoverflow上找到的waitForChildren children构造。

更新: waitForChildren发布在Comparing Haskell threads to kernel threads - is my benchmark viable?