免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8129 | 回复: 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
14 [报告]
发表于 2009-02-26 22:37 |只看该作者
谢谢了, 是我的问题.
之前懒省事用nc测试的.
刚刚自己写了一个小client, 做的测试, 没有问题了.

谢谢.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2009-02-26 17:39 |只看该作者
原帖由 luckyelement 于 2009-2-26 17:26 发表
想实现
client_1 向server 发数据的时, server可以响应.
client_2 同时向server 发数据, 不需要等到处理完client_1的数据, server就可以响应,
client_3 同时向server 发数据, 不需要等到处理完client_1,cli ...

难道现在不是这样的?

论坛徽章:
0
12 [报告]
发表于 2009-02-26 17:26 |只看该作者
想实现
client_1 向server 发数据的时, server可以响应.
client_2 同时向server 发数据, 不需要等到处理完client_1的数据, server就可以响应,
client_3 同时向server 发数据, 不需要等到处理完client_1,client_2的数据, server就可以响应,

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2009-02-26 17:05 |只看该作者
你想说明啥?你期望得到啥?

论坛徽章:
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的数据.

还是程序写的有问题?

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

不是这样的,是并发的。

论坛徽章:
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
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 吧。

论坛徽章:
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
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP