v      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~    (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNoneIUse the # instance to combine several flags: !mconcat [msgNoSignal, msgWaitAll]Use the ) instance to check whether a flag is set: .if flags .&. msgEndOfRecord /= mempty then ... MSG_EOR  MSG_NOSIGNALSuppresses the generation of PIPEA signals when writing to a socket that is no longer connected.FAlthough this flag is POSIX, it is not available on all platforms. Try msgNoSignal /= memptyin order to check whether this flag is defined on a certain platform. It is safe to just use this constant even if it might not have effect on a certain target platform. The platform independence of this flag is therefore fulfilled to some extent.9Some more explanation on the platform specific behaviour:Linux defines and supports  MSG_NOSIGNALL and properly suppresses the generation of broken pipe-related signals.AWindows does not define it, but does not generate signals either.&OSX does not define it, but generates PIPEs signals. The GHC runtime ignores them if you don't hook them explicitly. The non-portable socket option  SO_NOSIGPIPE8 may be used disable signals on a per-socket basis. MSG_OOB  MSG_WAITALL  (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone0I$4Contains the error code that can be matched against.Hint: Use guards or  MultiWayIf& to match against specific exceptions: Zif | e == eAddressInUse -> ... | e == eAddressNotAvailable -> ... | otherwise -> ... SocketException "No error"  )SocketException "Interrupted system call"oNOTE: This exception shall not be thrown by any public operation in this library, but is handled internally. %SocketException "Bad file descriptor" "SocketException "Invalid argument" SocketException "Broken pipe"  2SocketException "Resource temporarily unavailable"oNOTE: This exception shall not be thrown by any public operation in this library, but is handled internally. 2SocketException "Resource temporarily unavailable" 0SocketException "Socket operation on non-socket"2NOTE: This should be ruled out by the type system. .SocketException "Destination address required" "SocketException "Message too long" 0SocketException "Protocol wrong type for socket" (SocketException "Protocol not available" (SocketException "Protocol not supported" +SocketException "Socket type not supported" )SocketException "Operation not supported" /SocketException "Protocol family not supported" :SocketException "Address family not supported by protocol" (SocketException "Address already in use" 1SocketException "Cannot assign requested address" !SocketException "Network is down" (SocketException "Network is unreachable" 5SocketException "Network dropped connection on reset" 2SocketException "Software caused connection abort" *SocketException "Connection reset by peer" +SocketException "No buffer space available"! 9SocketException "Transport endpoint is already connected"" 5SocketException "Transport endpoint is not connected"# ?SocketException "Cannot send after transport endpoint shutdown"$ 4SocketException "Too many references: cannot splice"% &SocketException "Connection timed out"& $SocketException "Connection refused"' SocketException "Host is down"( "SocketException "No route to host") /SocketException "Operation already in progress"oNOTE: This exception shall not be thrown by any public operation in this library, but is handled internally.* +SocketException "Operation now in progress"'  !"#$%&'()*%  !"#$%&'()*&  !"#$%&'()*(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafe:DR+The +* determines the transport protocol to use.Use Y to let the operating system choose a transport protocol compatible with the socket's -.,This number designates this +` on the specific platform. This method is only exported for implementing extension libraries.6The function shall yield the values of constants like  IPPROTO_TCP,  IPPROTO_UDP etc.-The -^ determines properties of the transport layer and the semantics of basic socket operations.+The instances supplied by this library are  (no transport layer), ' (for unframed binary streams, e.g. ), + (for datagrams of limited length, e.g.  ) and 3 (for framed messages of arbitrary length, e.g. )..This number designates this -` on the specific platform. This method is only exported for implementing extension libraries.6The function shall yield the values of constants like  SOCK_STREAM,  SOCK_DGRAM etc./ The address /( determines the network protocol to use.%The most common address families are  (IPv4) and  (IPv6).0The 0 type is a  Ohttps://wiki.haskell.org/GHC/Type_families#Detailed_definition_of_data_families data family. This allows to provide different data constructors depending on the socket family without knowing all of them in advance or the need to extend this core library. SocketAddressInet inetLoopback 8080 :: SocketAddress Inet SocketAddressInet6 inet6Loopback 8080 0 0 :: SocketAddress Inet61The number designating this /` on the specific platform. This method is only exported for implementing extension libraries.7This function shall yield the values of constants like AF_INET, AF_INET6 etc.2A generic socket type. Use  to create a new socket.The socket is just an !-wrapped file descriptor. The  constructor is exported trough the unsafe module in order to make this library easily extensible, but it is usually not necessary nor advised to work directly on the file descriptor. If you do, the following rules must be obeyed:Make sure not to deadlock. Use  or similar. The lock must not~ be held during a blocking call. This would make it impossible to send and receive simultaneously or to close the socket. The lock must be held when calling operations that use the file descriptor. Otherwise the socket might get closed or even reused by another thread/capability which might result in reading from or writing on a totally different socket. This is a security nightmare!The socket is non-blocking and all the code relies on that assumption. You need to use GHC's eventing mechanism primitives to block until something happens. The former rules forbid to use _ as it does not separate between registering the file descriptor (for which the lock must: be held) and the actual waiting (for which you must not hold the lock). Also see  Jhttps://mail.haskell.org/pipermail/haskell-cafe/2014-September/115823.htmlthisX thread and read the library code to see how the problem is currently circumvented. +,-./0123 +,-./0123+,-./1023 (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone456456456!(c) Lars Petersen 2016MITinfo@lars-petersen.net experimentalNonebWhen enabled the protocol checks in a protocol-specific manner if the other end is still alive.Also known as  SO_KEEPALIVE.76Allows or disallows the reuse of a local address in a " call.Also known as  SO_REUSEADDR..This is particularly useful when experiencing  exceptions.92Reports the last error that occured on the socket.Also known as SO_ERROR.The operation = always throws   for this option.-Use with care in the presence of concurrency!;;9s allow to read and write certain properties of a socket.mEach option shall have a corresponding data type that models the data associated with the socket option.Use # and $2 in order to implement custom socket options.<Get a specific ;.This operation throws  s. Consult man getsockopt& for details and specific errors.=Set a specific ;.This operation throws  s. Consult man setsockopt& for details and specific errors.789:;<=>? 789:;<=>? 789:;<=>?(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone@Like % , but using  and length instead of a  ByteString.This function is unsafe. bufPtr/ must refer to a buffer which size is at least bufSize bytes.ALike & , but using  and length instead of a  ByteString.This function is unsafe. bufPtr/ must refer to a buffer which size is at least bufSize bytes.BLike ' , but using  and length instead of a  ByteString.This function is unsafe. bufPtr/ must refer to a buffer which size is at least bufSize bytes.CLike ( , but using  and length instead of a  ByteString.This function is unsafe. bufPtr/ must refer to a buffer which size is at least bufSize bytes.@ABCD 23456>?@ABCD 23@ABC?>456D@ABCD(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafeEFEEFEF(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNoneG.If set to True, disable the Nagle's algorithm. Also know as  TCP_NODELAY.GHIJKGHIIKGHJGHIJK(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafeOPOOPOP(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafeQRQQRQR(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafeSTSSTST(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalSafeUVUUVUV (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone9;DIRW  IPV6_V6ONLY\ITo avoid errors with endianess it was decided to keep this type abstract.Use _ and ^9 for constructing and deconstructing custom addresses.Hint: Use the ~ instance. It exposes it exactly as found within an IP packet (big endian if you insist on interpreting it as a number).Another hint: Use )0 for parsing and suppress nameserver lookups: > getAddressInfo (Just "::1") Nothing aiNumericHost :: IO [AddressInfo SocketAddressInet6 Stream TCP] [AddressInfo { addressInfoFlags = AddressInfoFlags 4, socketAddress = SocketAddressInet6 {inet6Address = Inet6Address 0000:0000:0000:0000:0000:0000:0000:0001, inet6Port = Inet6Port 0, inet6FlowInfo = Inet6FlowInfo 0, inet6ScopeId = Inet6ScopeId 0}, canonicalName = Nothing }]]The  "https://en.wikipedia.org/wiki/IPv6Internet Protocol version 6.^Deconstructs an \._Constructs a custom \. 8inet6AddressFromTuple (0,0,0,0,0,0,0,1) == inet6Loopback` ::a ::1+WXYZ[\]^_`abcdefghi0WXYZ[\]^_`a ]\[ZY_^`aWX WXYZ[\]^_`abcdefghi (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone9;DIR }ITo avoid errors with endianess it was decided to keep this type abstract.Use  and 9 for constructing and deconstructing custom addresses.Hint: Use the ~ instance. It exposes it exactly as found within an IP packet (big endian if you insist on interpreting it as a number).Another hint: Use )0 for parsing and suppress nameserver lookups:  > getAddressInfo (Just "127.0.0.1") Nothing aiNumericHost :: IO [AddressInfo Inet Stream TCP] [AddressInfo {addressInfoFlags = AddressInfoFlags 4, socketAddress = SocketAddressInet {inetAddress = InetAddress 127.0.0.1, inetPort = InetPort 0}, canonicalName = Nothing}]~The  "https://en.wikipedia.org/wiki/IPv4Internet Protocol version 4.Constructs a custom }. 0inetAddressFromTuple (127,0,0,1) == inetLoopbackDeconstructs an }. 0.0.0.0 255.255.255.255 255.255.255.255  127.0.0.1  224.0.0.0  224.0.0.1  224.0.0.255|}~  0 |}~ ~}||}~  *(c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone /0:DIRTHThis class is for address families that support reverse name resolution.I(Reverse-)map an address back to a human-readable host- and service name.The operation throws s. |> getNameInfo (SocketAddressInet inetLoopback 80) mempty NameInfo {hostName = "localhost.localdomain", serviceName = "http"}A # consists of host and service name.@This class is for address families that support name resolution.-Maps names to addresses (i.e. by DNS lookup).The operation throws s.Contrary to the underlying  getaddrinfo operation this wrapper is typesafe and thus only returns records that match the address, type and protocol encoded in the type. This is the price we have to pay for typesafe sockets and extensibility.If you need different types of records, you need to start several queries. If you want to connect to both IPv4 and IPV6 addresses use  and use IPv6-sockets. getAddressInfo (Just "www.haskell.org") (Just "https") mempty :: IO [AddressInfo Inet Stream TCP] > [AddressInfo {addressInfoFlags = AddressInfoFlags 0, socketAddress = SocketAddressInet {inetAddress = InetAddress 162.242.239.16, inetPort = InetPort 443}, canonicalName = Nothing}] > getAddressInfo (Just "www.haskell.org") (Just "80") aiV4Mapped :: IO [AddressInfo Inet6 Stream TCP] [AddressInfo { addressInfoFlags = AddressInfoFlags 8, socketAddress = SocketAddressInet6 {inet6Address = Inet6Address 2400:cb00:2048:0001:0000:0000:6ca2:cc3c, inet6Port = Inet6Port 80, inet6FlowInfo = Inet6FlowInfo 0, inet6ScopeId = Inet6ScopeId 0}, canonicalName = Nothing }] &> getAddressInfo (Just "darcs.haskell.org") Nothing aiV4Mapped :: IO [AddressInfo Inet6 Stream TCP] [AddressInfo { addressInfoFlags = AddressInfoFlags 8, socketAddress = SocketAddressInet6 {inet6Address = Inet6Address 0000:0000:0000:0000:0000:ffff:17fd:e1ad, inet6Port = Inet6Port 0, inet6FlowInfo = Inet6FlowInfo 0, inet6ScopeId = Inet6ScopeId 0}, canonicalName = Nothing }] > getAddressInfo (Just "darcs.haskell.org") Nothing mempty :: IO [AddressInfo Inet6 Stream TCP] *** Exception: AddressInfoException "Name or service not known"Use the # instance to combine several flags: 6mconcat [niNameRequired, niNoFullyQualifiedDomainName]Use the # instance to combine several flags: %mconcat [aiAddressConfig, aiV4Mapped]4Contains the error code that can be matched against.Hint: Use guards or  MultiWayIf& to match against specific exceptions: Iif | e == eaiFail -> ... | e == eaiNoName -> ... | otherwise -> ... ;AddressInfoException "Temporary failure in name resolution" -AddressInfoException "Bad value for ai_flags" AAddressInfoException "Non-recoverable failure in name resolution" .AddressInfoException "ai_family not supported" 0AddressInfoException "Memory allocation failure" ,AddressInfoException "No such host is known" =AddressInfoException "Servname not supported for ai_socktype" 0AddressInfoException "ai_socktype not supported" #AddressInfoException "System error" AI_ADDRCONFIG:AI_ALLI: Return both IPv4 (as v4-mapped IPv6 address) and IPv6 addresses when D is set independent of whether IPv6 addresses exist for this name. AI_CANONNAME:AI_NUMERICHOST:AI_NUMERICSERV: AI_PASSIVE: AI_V4MAPPEDL: Return mapped IPv4 addresses if no IPv6 addresses could be found or if  flag is set. NI_NAMEREQD:: Throw an exception if the hostname cannot be determined.NI_DGRAM": Service is datagram based (i.e. !) rather than stream based (i.e. ). NI_NOFQDNS: Return only the hostname part of the fully qualified domain name for local hosts.NI_NUMERICHOST.: Return the numeric form of the host address.NI_NUMERICSERV1: Return the numeric form of the service address.2   (  &   (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNone:DRT Creates a new socket.Whereas the underlying POSIX socket operation takes 3 parameters, this library encodes this information in the type variables. This rules out several kinds of errors and especially simplifies the handling of addresses (by using associated data families). Examples: &-- create an IPv4-UDP-datagram socket sock <- socket :: IO (Socket Inet Datagram UDP) -- create an IPv6-TCP-streaming socket sock6 <- socket :: IO (Socket Inet6 Stream TCP) -- create an IPv6-streaming socket with default protocol (usually TCP) sock6 <- socket :: IO (Socket Inet6 Strem Default)1This operation sets up a finalizer that automatically closes the socket when the garbage collection decides to collect it. This is just a fail-safe. You might still run out of file descriptors as there's no guarantee about when the finalizer is run. You're advised to manually @ the socket when it's no longer needed. If possible, use o to reliably close the socket descriptor on exception or regular termination of your computation: result <- bracket (socket :: IO (Socket Inet6 Stream TCP)) close $ \sock-> do somethingWith sock -- your computation here return somethingelseThis operation configures the socket non-blocking to work seamlessly with the runtime system's event notification mechanism.dThis operation can safely deal with asynchronous exceptions without leaking file descriptors.This operation throws s. Consult your  man socket( for details and specific errors.Connects to a remote address.This operation returns as soon as a connection has been established (as if the socket were blocking). The connection attempt has either failed or succeeded after this operation threw an exception or returned.The operation throws  s. Calling  on a d socket throws  = even if the former file descriptor has been reassigned.Bind a socket to an address.Calling  on a d socket throws  8 even if the former file descriptor has been reassigned.It is assumed that  never blocks and therefore *, ) and  % don't occur. This assumption is supported by the fact that the Linux manpage doesn't mention any of these errors, the Posix manpage doesn't mention the last one and even MacOS' implementation will never fail with any of these when the socket is configured non-blocking as  #http://stackoverflow.com/a/14485305 argued here.This operation throws s. Consult your man$ page for details and specific errnos.Starts listening and queueing connection requests on a connection-mode socket. The second parameter determines the backlog size.Calling  on a d socket throws  = even if the former file descriptor has been reassigned.The second parameter is called backlogt and sets a limit on how many unaccepted connections the transport implementation shall queue. A value of 0+ leaves the decision to the implementation.This operation throws s. Consult your  man listen& for details and specific errors.Accept a new connection.Calling  on a d socket throws  = even if the former file descriptor has been reassigned.?This operation configures the new socket non-blocking. It uses accept4i (when available) in order to accept and set the socket non-blocking with a single system call.@This operation sets up a finalizer for the new socket that automatically closes the new socket when the garbage collection decides to collect it. This is just a fail-safe. You might still run out of file descriptors as there's no guarantee about when the finalizer is run. You're advised to manually ' the socket when it's no longer needed.This operation throws s.This operation catches ,   and  + internally and retries automatically. Send data.Calling  on a d socket throws  = even if the former file descriptor has been reassigned.3The operation returns the number of bytes sent. On  and 8 sockets certain assurances on atomicity exist and  or  H are thrown until the whole message would fit into the send buffer.This operation throws  s. Consult man send& for details and specific errors.,   and   and handled internally and won't be thrown. For performance reasons the operation first tries a write on the socket and then waits when it got  or  .Like ., but allows to specify a destination address. Receive data.rThe operation takes a buffer size in bytes a first parameter which limits the maximum length of the returned +,.When an empty +, is returned this usally (protocol specific) means that the peer gracefully closed the connection. The user is advised to check for and handle this case.Calling  on a d socket throws  = even if the former file descriptor has been reassigned.This operation throws  s. Consult man recv& for details and specific errors.,   and   and handled internally and won't be thrown. For performance reasons the operation first tries a read on the socket and then waits when it got  or  2 until the socket is signaled to be readable.Like +, but additionally yields the peer address.Closes a socket.This operation is idempotent and thus can be performed more than once without throwing an exception. If it throws an exception it is presumably a not recoverable situation and the process should exit.This operation does not block.This operation wakes up all threads that are currently blocking on this socket. All other threads are guaranteed to not block on operations on this socket in the future. Threads that perform operations other than  on this socket will fail with  ( after the socket has been closed ( replaces the -. in the /0 with -13 to reliably avoid use-after-free situations)."This operation potentially throws s (only EIO is documented).  E is catched internally and retried automatically, so won't be thrown. k  !"#$%&'()*+,-./0102789:;<=j2/10-.+,;<=9:78  !"#$%&'()* (c) Lars Petersen 2015MITinfo@lars-petersen.net experimentalNoneSends a whole ] with as many system calls as necessary and returns the bytes sent (in this case just the s ).Like , but operates on lazy 1,s.It uses  internally to send all chunks sequentially. The lock on the socket is acquired for each chunk separately, so the socket can be read from in an interleaving fashion.Sends a whole  without allocating ys. If performance is an issue, this operation should be preferred over all other solutions for sending stream data.The operation Ytes a single buffer of the given size on entry and reuses this buffer until the whole p has been sent. The count of all bytes sent is returned as there is no other efficient way to determine a $s size without actually building it.Like , but operates on lazy 1,s and continues until either an empty part has been received (peer closed the connection) or given buffer limit has been exceeded or an exception occured.The  parameter is a soft limit on how many bytes to receive. Collection is stopped if the limit has been exceeded. The result might be up to one internal buffer size longer than the given limit. If the returned 1,us length is lower or eqal than the limit, the data has not been truncated and the transmission is complete. 2 2 3 4 5 6 7 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z[\]^_`a b c d!e!e!f!f!g!h!i!$!#jklmnoppqrstuvwxy z z { | } ~      ********)******************************"%&'(    0/  !!!!! { | } ~                          ******** *!*"*#*$%&'(,'+)'*+,-./0%socket-0.8.0.0-FcJcxr2WXUqFwZNlSsDYi2 System.SocketSystem.Socket.UnsafeSystem.Socket.Protocol.DefaultSystem.Socket.Protocol.TCPSystem.Socket.Protocol.UDP#System.Socket.Type.SequentialPacketSystem.Socket.Type.DatagramSystem.Socket.Type.RawSystem.Socket.Family.Inet6System.Socket.Family.InetSystem.Socket.Type.StreamSystem.Socket.Internal.Message System.Socket.Internal.ExceptionSystem.Socket.Internal.SocketSystem.Socket.ProtocolDefaultSystem.Socket.TypeRawStreamTCPDatagramUDPSequentialPacketSCTPSystem.Socket.FamilyInetInet6socketSocketGHC.ConcthreadWaitReadSystem.Socket.Internal.Platform#System.Socket.Internal.SocketOptionbindunsafeGetSocketOptionunsafeSetSocketOptionsendsendToreceive receiveFromgetAddressInfo"System.Socket.Internal.AddressInfoData.ByteString ByteStringSystem.Posix.TypesFdControl.Concurrent.MVarMVarData.ByteString.Lazy MessageFlagsmsgEndOfRecord msgNoSignal msgOutOfBand msgWaitAllSocketExceptioneOk eInterruptedeBadFileDescriptoreInvalidePipe eWouldBlockeAgain eNotSocketeDestinationAddressRequired eMessageSize eProtocolTypeeNoProtocolOptioneProtocolNotSupportedeSocketTypeNotSupportedeOperationNotSupportedeProtocolFamilyNotSupportedeAddressFamilyNotSupported eAddressInUseeAddressNotAvailable eNetworkDowneNetworkUnreachable eNetworkReseteConnectionAbortedeConnectionReseteNoBufferSpace eIsConnected eNotConnected eShutdowneTooManyReferences eTimedOuteConnectionRefused eHostDowneHostUnreachableeAlready eInProgressProtocolprotocolNumberType typeNumberFamily SocketAddress familyNumberwaitRead waitWrite waitConnected ReuseAddressError SocketOptiongetSocketOptionsetSocketOption unsafeSend unsafeSendTo unsafeReceiveunsafeReceiveFromtryWaitRetryLoop$fProtocolDefaultNoDelay$fSocketOptionNoDelay $fProtocolTCP $fEqNoDelay $fOrdNoDelay $fShowNoDelay $fProtocolUDP$fTypeSequentialPacket$fTypeDatagram $fTypeRawV6Only Inet6ScopeId Inet6FlowInfo Inet6Port Inet6Addressinet6AddressToTupleinet6AddressFromTupleinet6Any inet6Loopback$fSocketOptionV6Only$fStorableSocketAddress$fStorableInet6ScopeId$fStorableInet6FlowInfo$fStorableInet6Port$fStorableInet6Address$fShowInet6Address $fFamilyInet6$fEqSocketAddress$fShowSocketAddress$fEqInet6Address $fEqInet6Port$fOrdInet6Port$fShowInet6Port$fNumInet6Port$fEqInet6FlowInfo$fOrdInet6FlowInfo$fShowInet6FlowInfo$fNumInet6FlowInfo$fEqInet6ScopeId$fOrdInet6ScopeId$fShowInet6ScopeId$fNumInet6ScopeId $fEqV6Only $fOrdV6Only $fShowV6OnlyInetPort InetAddressinetAddressFromTupleinetAddressToTupleinetAny inetBroadcastinetNone inetLoopbackinetUnspecificGroupinetAllHostsGroupinetMaxLocalGroup$fStorableInetAddress$fStorableInetPort$fShowInetAddress $fFamilyInet$fEqInetAddress $fEqInetPort $fOrdInetPort$fShowInetPort $fNumInetPort HasNameInfo getNameInfoNameInfohostName serviceNameHasAddressInfo NameInfoFlagsAddressInfoFlagsAddressInfoException AddressInfoaddressInfoFlags socketAddress canonicalNameeaiAgain eaiBadFlagseaiFail eaiFamily eaiMemory eaiNoName eaiService eaiSocketType eaiSystemaiAddressConfigaiAllaiCanonicalName aiNumericHostaiNumericService aiPassive aiV4MappedniNameRequired niDatagramniNoFullyQualifiedDomainName niNumericHostniNumericServiceconnectlistenacceptclosesendAll sendAllLazysendAllBuilder receiveAll $fTypeStreambaseGHC.BaseMonoid Data.BitsBitsMessage$fShowMessageFlags$fMonoidMessageFlags$fShowSocketException$fExceptionSocketExceptionGHC.MVarwithMVarCSSizec_gai_strerror c_getnameinfoc_freeaddrinfo c_getaddrinfoc_memset c_setsockopt c_getsockopt c_recvfromc_recvc_sendtoc_sendc_listenc_accept c_connectc_bindc_closec_socketwait KeepAlive$fSocketOptionKeepAlive$fSocketOptionReuseAddress$fSocketOptionErrorGHC.PtrPtrForeign.StorableStorableSocketAddressInet6 inet6Address inet6Port inet6FlowInfo inet6ScopeIdw64_0w64_1w64_2w64_3w64_4w64_5w64_6w64_7w32_0w32_1w32_2w32_3w16_0w16_1D:R:SocketAddressInet60SocketAddressInet inetAddressinetPortD:R:SocketAddressInet0getAddressInfo' getNameInfo'$fHasNameInfoInet6$fHasNameInfoInet$fHasAddressInfoInet6$fHasAddressInfoInet$fMonoidNameInfoFlags$fMonoidAddressInfoFlags$fExceptionAddressInfoException$fShowAddressInfoExceptionControl.Exception.Basebracketbytestring-0.10.8.1Data.ByteString.Internallength Data.ByteString.Builder.InternalBuilderForeign.Marshal.AllocallocaGHC.IntInt64