socket
An extensible socket library.
https://github.com/lpeterse/haskell-socket
| Version on this page: | 0.6.0.1 | 
| LTS Haskell 24.18: | 0.8.3.0@rev:2 | 
| Stackage Nightly 2025-11-04: | 0.8.3.0@rev:2 | 
| Latest on Hackage: | 0.8.3.0@rev:2 | 
socket-0.6.0.1@sha256:925045b7fe07ee3f5603ab0948777e70477b607a1562f3e10adab28124146217,5609Module documentation for 0.6.0.1
- System
- System.Socket
- System.Socket.Family
 - System.Socket.Protocol
 - System.Socket.Type
 - System.Socket.Unsafe
 
 
 - System.Socket
 
socket
Motivation
This library aims to expose a minimal and cross platform interface for POSIX compliant networking code.
Implementation Philosophy
- 
Every operation and every flag exposed should be supported with same semantics on every platform. If this cannot be guaranteed it should be supplied by another (extension) package.
 - 
Absolutely no conditional exports.
 - 
No
#ifdefmadness in the Haskell sources. The Haskell binding code uses the FFI to reference the platform’s native networking functions. If they are not POSIX compliant (i.e. on Windows) a level of indirection is introduced to create a POSIX compliant equivalent in C using whatever the platform specific building blocks are. 
Platform Support
Linux
Working.
MacOS
Working.
Windows
Fully supported on Windows7 (maybe Vista) or higher :-)
GHC’s runtime system on Windows does not offer an event notification mechanism for sockets. The original network library suffers from this, too. For example, connection attempts are non-interruptible etc. The approach taken to circumvent this in this library is to poll the non-blocking sockets with increasing delay. This guarantees non-interruptability and fairness between different threads. It allows for decent throughput while also keeping CPU consumption on a moderate level if a socket has not seen events for a longer period of time (maximum of 1 second delay after 20 polling iterations). The only drawback is potentially reduced response time of your application. The good part: Heavy load (e.g. connection requests or incoming traffic) will reduce this problem. Eventually your accepting thread won’t wait at all if there are several connection requests queued.
This workaround may be removed if someone is willing to sacrifice to improve the IO manager on Windows.
Dependencies
- base
 - bytestring
 
Tests
Run the default test suites:
cabal test
Changes
0.6.0.1 Lars Petersen [email protected] 2016-04-10
- Adapted the 
AddrInfotest suite to not depend on specific nameresolution features that aren’t available in achroot()environment (see issue #12). 
0.6.0.0 Lars Petersen [email protected] 2016-03-26
- Improved and adapted documentation.
 - Merged 
GetSocketOptionandSetSocketOptionto one single type classSocketOption. getNameInfonow returnsNameInfoinstead of a tuple.- Added all theoretically possible 
SocketExceptions. - The type class 
GetNameInfohas been renamed toHasNameInfo. - The type class 
GetAddressInfohas been renamed toHasAddressInfo. - Removed operation 
withConnectedSocketwithout replacement. It should not be part of this minimal library. Its code can be retrieved from the repository if needed. - The operations 
sendAllandreceiveAllare now exported throughSystem.Socket.Type.Streamand no longer trough the main module. They are very specific, solely stream-oriented and just wrappers around the basic operations. Such operations shouldn’t pollute the main module. - Issue #10: Ben Gamari reported that the associated type 
SocketAddressis not injective which would lead to compilation failure on GHC 8.* . This is fixed by using a data family instead. 
0.5.3.0 Lars Petersen [email protected] 2015-08-09
- Added a test for 
eOperationNotSupported(try to listen on a UDP socket). - Niklas Hambüchen added 
eOperationNotSupported. 
0.5.2.0 Lars Petersen [email protected] 2015-07-08
- Don’t set 
msgNoSignalautomatically withsendandsendTo. This implicit behaviour is a bad design decision. The implications of this change are rather limited. The behaviour/correctness of an application is only affected if it hooked SIGPIPE. GHC’s RTS by default ignores SIGPIPE since #1619. You’re still advised to adapt your applications to usemsgNoSignalexplicitly when writing on stream oriented sockets. Otherwise the RTS gets unnecessarily interrupted. This is harmless, but annoying and not desired when developing high-performance applications. - Define 
msgNoSignalas 0 if not available and documented this behaviour. - Added new exception value 
ePipe. 
0.5.1.0 Lars Petersen [email protected] 2015-06-22
- Exposed 
unsafeGetSocketOptionandunsafeSetSocketOption. - Exposed 
socketWaitReadandsocketWaitWritethroughSystem.Socket.Unsafe. 
0.5.0.0 Lars Petersen [email protected] 2015-06-19
- Introduced newtypes 
Port,FlowInfoandScopeIdin Inet6 family. - Renamed nearly everything in response to very constructive criticism by Bryan O’Sullivan. This is a breaking change (sorry about that). I felt this was the last chance to get this straight before the library gets widely adopted. Additional kudos to @ignorantone and @whatsthepoint.
 - Issue #7: Typo in documentation of inaddrNONE and inaddrBROADCAST. Kudos to Michael Fox.
 
0.4.0.1 Lars Petersen [email protected] 2015-06-17
- tar-ball did not contain relevant source files.
 
0.4.0.0 Lars Petersen [email protected] 2015-06-16
- Changed semantics of 
connectoperation. It now blocks until a connection has either has been established or failed. - Added 
SO_ERRORsocket option. - Added 
eALREADYexception constant. - Added 
eISCONNexception constant. - Added 
eNOTCONNexception constant. - Added convenience operation 
withConnectedSocket. - Added 
eNETUNREACHexception constant. - Added new operation 
recvAlland changedsendAllto lazyByteString. - Added new socket option IPV6_V6ONLY.
 - Removed untested socket option SO_ACCEPTCONN.
 - Correctly defining AI_ flags on Windows (MinGW doesn’t although they are all well support on Vista or higher).
 - Got all tests passing on Windows 7.
 
0.3.0.1 Lars Petersen [email protected] 2015-06-07
- Fixed documentation of eaiNONAME.
 - Fixed typo in .cabal file in reference to cbits file.
 
0.3.0.0 Lars Petersen [email protected] 2015-06-07
AddrInfoFlagsandNameInfoFlagsare now instances ofBits.- Dropped all sendmsg/recvmsg related operations (harden the core first!)
 - Dropped support for UNIX socket (will be separate package 
socket-unix) - Renamed type function 
AddresstoSockAddr. - Added GetAddrInfo and GetNameInfo classes.
 - Dropped support for SCTP (will be separate package 
socket-sctp) - Added support for RAW sockets.
 - Started to support Windows (still unfinished).
 - New operation 
recvRecord. - ReceiveMsg now returns a strict 
ByteString. - New operations 
sendV,sendToV. - Restricted getAddrInfo and getNameInfo and added 
getAddrInfo6andgetNameInfo6 - Added address family types INET, INET6 and UNIX (API breaking change)
 - Hide 
SockAddrIn6address constructor - Hide 
SockAddrInaddress constructor - Added 
recvMsgoperation - Fixed unsafeSend, unsafeSendTo and unsafeSendMsg (they were waiting for a read event instead of waiting for writing)
 - Use 
aiStrErrorvalues in Show instance - Added 
aiStrErrorfunction - Added constants for AddrInfoException
 - Changed definitin of AddrInfoException
 - Added 
sendAllMsgoperation - Added 
sendMsgoperation (+ some types and internals) 
0.2.0.0 Lars Petersen [email protected] 2015-05-29
- Added a sendAll operation
 - Exposed the Socket constructor
 - Added 
getNameInfooperation - Added msgWAITALL and fixed serious bug regarding all other MsgFlags
 - Nicer Show instances for SockAddrIn and SockAddrIn6
 - Hiding internal modules
 - Added 
getAddrInfooperation 
0.1.0.1 Lars Petersen [email protected] 2015-05-28
- Added CHANGELOG.md
 - Removed 
threadWaitReadMVarandthreadWaitWriteMVar - Import 
Data.MonoidinSystem.Socket.Unsafeto support older Preludes 
0.1.0.0 Lars Petersen [email protected] 2015-05-28
- Initial release