新问题:haskell Network.Socket 监听TCP 如何持续接收数据?

发布于 2022-08-14 10:37:54 字数 979 浏览 9 评论 9

新问题在三楼

看了一下 Network 和 Network.Socket
如果用Network 里面的ListenOn 可以监听TCP 端口.

用Network.Socket 不知道如何监听TCP 端口 .
监听UDP端口的实例如下:

import Network.Socket
import IO

main = withSocketsDo $ do
        s <- socket AF_INET Datagram 17
        addr <- inet_addr "127.0.0.1"
        bindSocket s (SockAddrInet 30000 addr)
        putStrLn "Listening port 30000 ..."
        (m,l,f) <- recvFrom s 1024
        putStrLn $ "msg from " ++ (show f) ++ "length " ++ (show l)
        putStrLn m

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

乖乖 2022-08-21 01:23:26

8楼的代码是可以编译的. 可以测试一下.

运行server.exe, 监听端口30000
client_1 : nc -vv 127.0.0.1 30000
client_2 : nc -vv 127.0.0.1 30000
两个连接建立成功.

client_1 给server发送数据
client_2 给server发送数据

server 返回的结果, 处理(显示)完client_1的数据, 再处理(显示)client_2的数据.

还是程序写的有问题?

习ぎ惯性依靠 2022-08-21 01:22:49

> 处理完一个client发的数据,再处理下一个client发的数据.

不是这样的,是并发的。

-黛色若梦 2022-08-21 00:58:25
main = do
        putStrLn "Start Server!"
        mainserver

mainserver = withSocketsDo $ do
        sock <- socket AF_INET Stream 6
        bindSocket sock (SockAddrInet 30000 iNADDR_ANY)
        listen sock 10
        putStrLn "Server Listening port 30000 ..."
        loopserver sock

loopserver sock = do
        (s,c) <- accept sock
        forkIO $ clientloop s c
        loopserver sock

clientloop s c = do
        msg <- recvFrom s 1024
        print msg
        sendTo s "I'm Servern" c
        clientloop s c

揽清风入怀 2022-08-20 23:45:50

loopserver sock = do
        (s,c) <- accept sock
        forkIO $ perClientLoop s
        loopserver sock

perClientLoop s = do
        msg <- recvFrom s 1024
        print msg
        send msg "I'm Server"
        perClientLoop s

看了一下,Network.Socket 这套接口太底层了,还是用 Network 吧。

醉梦枕江山 2022-08-20 22:58:05

Network.Socket 里的接口:

listen :: Socket -> Int -> IO ()

Network 里的接口:

listenOn
:: PortID        Port Identifier
-> IO Socket        Connected Socket

秋凉 2022-08-20 13:45:48

给你一个简单例子,server把收到的内容原样发给client

  1. import Network
  2. import System.IO
  3. main = listenOn (PortNumber 30000) >>=
  4.           sock -> accept sock >>= talk >> sClose sock
  5.     where talk (h, name, port) = do
  6.                 hSetBuffering h LineBuffering
  7.                 hGetContents h >>= hPutStr h >> hClose h

复制代码

世界如花海般美丽 2022-08-20 00:46:55

这一步过去,下一步就可以做数据处理了, 结果又K啦.

霊感 2022-08-15 18:32:17
module Main where

import Network.Socket
import IO

main = do
          putStrLn "Server start ... "
          mainserver

mainserver = withSocketsDo $ do
        s <- socket AF_INET Stream 6
        s_addr <- inet_addr "127.0.0.1"
        bindSocket s (SockAddrInet 30000 s_addr)
        putStrLn $ "Listening port 30000 ......"
        listen s 10
        loopserver s

loopserver sock = do
        (s,c) <- accept sock
        msg <- recvFrom s 1024
        print msg
        send msg "I'm Server"
        loopserver sock

分開簡單 2022-08-15 10:44:47

tcp难道不需要listen吗? 还有accept
可参考一下http://book.realworldhaskell.org/read/sockets-and-syslog.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文