首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将sendAll消息发送给套接字客户端会导致:“`Exception: Network.Socket.sendBuf:无效参数(传输端点未连接)”

将sendAll消息发送给套接字客户端会导致:“`Exception: Network.Socket.sendBuf:无效参数(传输端点未连接)”
EN

Stack Overflow用户
提问于 2020-05-27 20:17:56
回答 1查看 280关注 0票数 1

当从套接字服务器调用Network.Socket.ByteString.sendAll (hackage docs - sendall) (发送到套接字客户端)时,我遇到了一个Network.Socket.ByteString.sendAll错误。

我不知道为什么会有这个错误?看来我只能用一种方式发送数据?

在使用netcat而不是Haskell客户端时,我也遇到了相同的错误:

代码语言:javascript
复制
echo 'test' | nc  -N -U /tmp2/test2.soc

客户的输出:

代码语言:javascript
复制
*Server Main> main
Hello, Haskell!2
"sent ping....."

来自服务器的输出:

代码语言:javascript
复制
*Server> serv
"begin"
"Running daemon"
"begin2"
<socket: 13>

"Got message:"
"ping"
"Sending pong...."
*** Exception: Network.Socket.sendBuf: invalid argument (Transport endpoint is not connected)

完整项目:https://github.com/chrissound/UnixSocketPingPongHaskellTest

完整源代码:

客户:

代码语言:javascript
复制
{-# Language OverloadedStrings #-}
module Main where

import Network.Socket hiding (send)
import Network.Socket.ByteString as NBS
import Control.Concurrent
import Control.Monad

main :: IO ()
main = do
  putStrLn "Hello, Haskell!2"
  withSocketsDo $ do
    soc <- socket AF_UNIX Stream 0
    connect (soc) (SockAddrUnix "/tmp2/test2.soc")
    forever $ do
      send soc ("ping")
      threadDelay $ 1 * 10^6
      print "sent ping....."
      threadDelay $ 1 * 10^6
      msg <- NBS.recv soc 400000
      print msg
      print "got reply to ping...."
    close soc

服务器:

代码语言:javascript
复制
{-# Language OverloadedStrings #-}
module Server where

import Network.Socket hiding (send)
import Network.Socket.ByteString as NBS
import Control.Concurrent
import Control.Monad

serv :: IO ()
serv = do
  print "begin"
  print "Running daemon"
  soc <- socket AF_UNIX Stream 0
  bind soc . SockAddrUnix $ "/tmp2/test2.soc"
  listen soc maxListenQueue
  accept soc >>= (\(x,y)-> do
    print "begin2"
    print x
    print y
    forever $ do
      msg <- NBS.recv x 400000
      print "Sending pong...."
      NBS.sendAll soc "ppong"
      print "alll done"

      threadDelay $ 3 * 10^6
      )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-27 22:15:18

您正在侦听套接字上发送;您可能希望使用已接受的套接字来发送。

代码语言:javascript
复制
  listen soc maxListenQueue
  accept soc >>= (\(x,y)-> do
    ...
    NBS.sendAll soc "ppong"  -- should be   sendAll x "ppong"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62052147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档