Haskell сообщение sendAll клиенту сокета приводит к: `Исключение: Network.Socket.sendBuf: недопустимый аргумент (конечная точка транспорта не подключена)` - PullRequest
0 голосов
/ 27 мая 2020

У меня возникает ошибка *** Exception: Network.Socket.sendBuf: invalid argument (Transport endpoint is not connected) при вызове Network.Socket.ByteString.sendAll ( hackage docs - sendall ) с сервера сокета (для отправки клиенту сокета).

Я не уверен, почему я получаю эту ошибку? Кажется, я могу отправить данные только в одну сторону?

Я также сталкиваюсь с той же ошибкой при использовании netcat вместо Haskell клиента:

echo 'test' | nc  -N -U /tmp2/test2.soc

Вывод от клиента :

*Server Main> main
Hello, Haskell!2
"sent ping....."

Вывод с сервера:

*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

Полный исходный код:

клиент:

{-# 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

сервер:

{-# 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
      )

1 Ответ

3 голосов
/ 28 мая 2020

Вы отправляете на слушающий сокет; вы, вероятно, захотите вместо этого отправить на принятый сокет.

  listen soc maxListenQueue
  accept soc >>= (\(x,y)-> do
    ...
    NBS.sendAll soc "ppong"  -- should be   sendAll x "ppong"
...