免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8115 | 回复: 13
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-20 16:00 |只看该作者 |倒序浏览
新问题在三楼

看了一下 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


如果把  17 (udp)  改成 6 (tcp) 提示错误.
socket: failed (Protocol not supported (WSAEPROTONOSUPPORT))

参考文档: http://cvs.haskell.org/Hugs/page ... ml#t%3ASocketStatus
http://cvs.haskell.org/Hugs/pages/libraries/network/Network.html

望指点一下. 谢谢.

[ 本帖最后由 luckyelement 于 2009-2-23 18:40 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-20 19:52 |只看该作者
tcp难道不需要listen吗? 还有accept
可参考一下http://book.realworldhaskell.org/read/sockets-and-syslog.html

论坛徽章:
0
3 [报告]
发表于 2009-02-20 23:37 |只看该作者
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


运行server.exe  
开启新的cmd.  执行: nc -vv 127.0.0.1 30000
输入:  hello
server 可以获得数据 hello
client 也可以数据: I'm server

但是在client端再发送数据的时候, server就获取不到数据了, 这个地方应该怎么操作呢? 我的思路是添加一个循环, 但是不知道如何添加.

帮忙指点一下.   谢谢.

[ 本帖最后由 luckyelement 于 2009-2-23 18:37 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-23 18:41 |只看该作者
这一步过去,下一步就可以做数据处理了, 结果又K啦.

论坛徽章:
0
5 [报告]
发表于 2009-02-25 14:25 |只看该作者
给你一个简单例子,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
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2009-02-26 10:35 |只看该作者
Network.Socket 里的接口:

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

Network 里的接口:

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2009-02-26 10:43 |只看该作者
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 吧。

论坛徽章:
0
8 [报告]
发表于 2009-02-26 12:47 |只看该作者

谢谢

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


这种模式, 应该是阻塞方式, 多个client连接server, server处理完一个client发的数据,再处理下一个client发的数据.
在haskell 里面有没有非阻塞方式, 或者 同步, 异步? 消息模型, 找了一下, 没有找到.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2009-02-26 15:09 |只看该作者
> 处理完一个client发的数据,再处理下一个client发的数据.

不是这样的,是并发的。

论坛徽章:
0
10 [报告]
发表于 2009-02-26 16: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的数据.

还是程序写的有问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP