亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8218 | 回復(fù): 13
打印 上一主題 下一主題

新問題:haskell Network.Socket 監(jiān)聽TCP 如何持續(xù)接收數(shù)據(jù)? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-02-20 16:00 |只看該作者 |倒序?yàn)g覽
新問題在三樓

看了一下 Network 和 Network.Socket
如果用Network 里面的ListenOn 可以監(jiān)聽TCP 端口.

用Network.Socket 不知道如何監(jiān)聽TCP 端口 .
監(jiān)聽UDP端口的實(shí)例如下:


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) 提示錯(cuò)誤.
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

望指點(diǎn)一下. 謝謝.

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

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-02-20 19:52 |只看該作者
tcp難道不需要listen嗎? 還有accept
可參考一下http://book.realworldhaskell.org/read/sockets-and-syslog.html

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 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


運(yùn)行server.exe  
開啟新的cmd.  執(zhí)行: nc -vv 127.0.0.1 30000
輸入:  hello
server 可以獲得數(shù)據(jù) hello
client 也可以數(shù)據(jù): I'm server

但是在client端再發(fā)送數(shù)據(jù)的時(shí)候, server就獲取不到數(shù)據(jù)了, 這個(gè)地方應(yīng)該怎么操作呢? 我的思路是添加一個(gè)循環(huán), 但是不知道如何添加.

幫忙指點(diǎn)一下.   謝謝.

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

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-02-23 18:41 |只看該作者
這一步過去,下一步就可以做數(shù)據(jù)處理了, 結(jié)果又K啦.

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-02-25 14:25 |只看該作者
給你一個(gè)簡(jiǎn)單例子,server把收到的內(nèi)容原樣發(fā)給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
復(fù)制代碼

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
6 [報(bào)告]
發(fā)表于 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 [報(bào)告]
發(fā)表于 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 [報(bào)告]
發(fā)表于 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


這種模式, 應(yīng)該是阻塞方式, 多個(gè)client連接server, server處理完一個(gè)client發(fā)的數(shù)據(jù),再處理下一個(gè)client發(fā)的數(shù)據(jù).
在haskell 里面有沒有非阻塞方式, 或者 同步, 異步? 消息模型, 找了一下, 沒有找到.

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
9 [報(bào)告]
發(fā)表于 2009-02-26 15:09 |只看該作者
> 處理完一個(gè)client發(fā)的數(shù)據(jù),再處理下一個(gè)client發(fā)的數(shù)據(jù).

不是這樣的,是并發(fā)的。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2009-02-26 16:26 |只看該作者
8樓的代碼是可以編譯的. 可以測(cè)試一下.

運(yùn)行server.exe, 監(jiān)聽端口30000
client_1 : nc -vv 127.0.0.1 30000
client_2 : nc -vv 127.0.0.1 30000
兩個(gè)連接建立成功.

client_1 給server發(fā)送數(shù)據(jù)
client_2 給server發(fā)送數(shù)據(jù)



server 返回的結(jié)果, 處理(顯示)完client_1的數(shù)據(jù), 再處理(顯示)client_2的數(shù)據(jù).

還是程序?qū)懙挠袉栴}?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP