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