Copyright | (c) Dong Han 2018 |
---|---|
License | BSD |
Maintainer | winterland1989@gmail.com |
Stability | experimental |
Portability | non-portable |
Safe Haskell | None |
Language | Haskell2010 |
This module provides an API for creating TCP servers and clients.
Synopsis
- data TCPClientConfig = TCPClientConfig {}
- data UVStream
- defaultTCPClientConfig :: TCPClientConfig
- initTCPClient :: HasCallStack => TCPClientConfig -> Resource UVStream
- getTCPSockName :: HasCallStack => UVStream -> IO SocketAddr
- data TCPServerConfig = TCPServerConfig {}
- defaultTCPServerConfig :: TCPServerConfig
- startTCPServer :: HasCallStack => TCPServerConfig -> (UVStream -> IO ()) -> IO ()
- getTCPPeerName :: HasCallStack => UVStream -> IO SocketAddr
- helloWorldWorker :: UVStream -> IO ()
- echoWorker :: UVStream -> IO ()
- setTCPNoDelay :: HasCallStack => UVStream -> Bool -> IO ()
- setTCPKeepAlive :: HasCallStack => UVStream -> CUInt -> IO ()
- initTCPStream :: HasCallStack => UVManager -> Resource UVStream
TCP Client
data TCPClientConfig Source #
A TCP client configuration
TCPClientConfig | |
|
A haskell data type wrap an uv_stream_t
inside
UVStream
DO NOT provide thread safety! Use UVStream
concurrently in multiple
threads will lead to undefined behavior.
defaultTCPClientConfig :: TCPClientConfig Source #
Default config, connect to localhost:8888
.
initTCPClient :: HasCallStack => TCPClientConfig -> Resource UVStream Source #
init a TCP client Resource
, which open a new connect when used.
getTCPSockName :: HasCallStack => UVStream -> IO SocketAddr Source #
Get the current address to which the handle is bound.
TCP Server
data TCPServerConfig Source #
A TCP server configuration
TCPServerConfig | |
|
defaultTCPServerConfig :: TCPServerConfig Source #
A default hello world server on localhost:8888
Test it with main = startTCPServer defaultTCPServerConfig helloWorldWorker
or
main = startTCPServer defaultTCPServerConfig echoWorker
, now try nc -v 127.0.0.1 8888
:: HasCallStack | |
=> TCPServerConfig | |
-> (UVStream -> IO ()) | worker which will get an accepted TCP stream and run in a seperated haskell thread, the socket will be closed upon exception or worker finishes. |
-> IO () |
Start a server
Fork new worker thread upon a new connection.
getTCPPeerName :: HasCallStack => UVStream -> IO SocketAddr Source #
Get the address of the peer connected to the handle.
helloWorldWorker :: UVStream -> IO () Source #
A server worker output "hello world" and close the connection.
echoWorker :: UVStream -> IO () Source #
A server worker echo whatever received bytes.
Internal helper
setTCPNoDelay :: HasCallStack => UVStream -> Bool -> IO () Source #
Enable or disable TCP_NODELAY
, which disables Nagle’s algorithm.
setTCPKeepAlive :: HasCallStack => UVStream -> CUInt -> IO () Source #
initTCPStream :: HasCallStack => UVManager -> Resource UVStream Source #