0

I try to connect to created socket by haskell:

-- Logger
  putStrLn "Create socket"
  sock_logger <- socket AF_INET Stream 0     
  putStrLn "Bind socket"           
  connect sock_logger (SockAddrInet 5000 0)    
  putStrLn "Listen socket"  
  listen sock_logger 2                                  
  putStrLn "Logger listening on port 5000..."
  (conn_logger, _) <- accept sock_logger                       
  putStrLn "Logger connection accepted"

Scocket already created by other application. But after connect sock_logger (SockAddrInet 5000 0) i get

helloworld-exe.EXE: Network.Socket.connect: <socket: 440>: failed (Cannot assign requested address (WSAEADDRNOTAVAIL))

How can i connect to socket as client (without creation new socket) All sockets i create with SockAddrInet 5000 0. Can it depends on addlress (maybe need 127.0.0.1 instead localhost?)

sjakobi
  • 3,546
  • 1
  • 25
  • 43
kepich
  • 98
  • 1
  • 1
  • 8
  • Are you sure nothing else is listening on that port? – Willem Van Onsem Jun 15 '22 at 19:18
  • Hm, I'm not a socket expert, but isn't `listen` usually done after a `bind`, not a `connect`? i.e. the pattern for servers is `bind`, `listen`, `accept`*, then you can send and receive on the result, while for clients it is `connect`, then you can send and receive on the result. – Daniel Wagner Jun 15 '22 at 22:10

2 Answers2

0

Perhaps you're looking for tupleToHostAddress, as in

connect sock_logger (SockAddrInet 5000 (tupleToHostAddress (127, 0, 0, 1)))
Daniel Wagner
  • 145,880
  • 9
  • 220
  • 380
0

Thx Daniel Wagner, it's really need to use tupleToHostAddress (127, 0, 0, 1) and listen ... is wrong. Right version:

  putStrLn "Create socket"
  sock_logger <- socket AF_INET Stream 0     
  putStrLn "Bind socket"           
  connect sock_logger (SockAddrInet 5000 (tupleToHostAddress (127, 0, 0, 1)))                      
  putStrLn "Connected to logger on port 5000..."
kepich
  • 98
  • 1
  • 1
  • 8