2015-04-12 53 views
2

我是新来试图用Unix套接字编程,并努力获得一个简单的服务器工作。我希望这样可以保持运行并打印收到的消息,但是会打印第一条消息并退出。取决于networkbytestring简单的unix域套接字服务器

module Main where 

import Network.Socket hiding (send, sendTo, recv, recvFrom) 
import Network.Socket.ByteString 
import qualified Data.ByteString.Char8 as C 
import Control.Monad 

main :: IO() 
main = withSocketsDo $ do 
     sock <- socket AF_UNIX Stream 0 -- and try UDP? 
     bind sock (SockAddrUnix "/tmp/test_sock.ipc") 
     listen sock maxListenQueue -- TODO is maxListenQueue what we want? 
     (conn, _) <- accept sock 
     talk conn 
     close conn 
     close sock 
     putStrLn "DONE" 

    where 
     talk :: Socket -> IO() 
     talk conn = 
      do msg <- recv conn 1024 
      unless (C.null msg) $ do 
       C.putStrLn msg 
       talk conn 

我与socat测试,这也是我真的不知道如何使用:

echo "FOOOOO" | socat - UNIX-CONNECT:/tmp/test_sock.ipc 

在Haskell代码的任何指针,我可能是误解有关Unix套接字会有帮助。

编辑使用Datagram代替Stream我能够获得更多或更少的什么我想:

主要:: IO() 主要= $ withSocketsDo做 袜子< - 插座AF_UNIX数据报0 - - 并尝试UDP? 绑定袜子(SockAddrUnix “/tmp/test_sock.ipc”) - 对数据报: 谈话袜子 接近袜子 putStrLn “DONE”

where 
    talk :: Socket -> IO() 
    talk conn = 
     do msg <- recv conn 1024 
     unless (C.null msg) $ do 
      C.putStrLn msg 
      talk conn 

而且我可以成功地测试:

echo "FOOOOO" | socat - UNIX-SENDTO:/tmp/test_sock.ipc 

无论如何,我认为我对数据报套接字感兴趣,但是如果有人想向我解释某些事情,我会保持开放状态。

回答

2

您的代码只运行一次“接受”,因此它只能处理一个连接。如果您想处理多个连接,则必须重复“接受”部分,而不仅仅是“recv”部分。

module Main where 

import Network.Socket hiding (send, sendTo, recv, recvFrom) 
import Network.Socket.ByteString 
import qualified Data.ByteString.Char8 as C 
import Control.Monad 

main :: IO() 
main = withSocketsDo $ do 
     sock <- socket AF_UNIX Stream 0 -- and try UDP? 
     bind sock (SockAddrUnix "/tmp/test_sock.ipc") 
     listen sock maxListenQueue -- TODO is maxListenQueue what we want? 
     go sock 
     close conn 
     close sock 
     putStrLn "DONE" 

    where 
     go sock = do 
     (conn,_) <- accept sock 
     talk conn 
     go sock 
     talk :: Socket -> IO() 
     talk conn = 
      do msg <- recv conn 1024 
      unless (C.null msg) $ do 
       C.putStrLn msg 
       talk conn 
相关问题