2
我是新来试图用Unix套接字编程,并努力获得一个简单的服务器工作。我希望这样可以保持运行并打印收到的消息,但是会打印第一条消息并退出。取决于network
和bytestring
。简单的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
无论如何,我认为我对数据报套接字感兴趣,但是如果有人想向我解释某些事情,我会保持开放状态。