@@ -99,10 +99,9 @@ tcpTest client server = withPort $ test . setClientAction client . tcp server
99
99
tcp :: (Socket -> IO b ) -> MVar PortNumber -> ClientServer Socket ()
100
100
tcp serverAct portVar = defaultClientServer
101
101
{ clientSetup = do
102
- let hints = defaultHints { addrSocketType = Stream }
103
102
serverPort <- readMVar portVar
104
- addr: _ <- getAddrInfo ( Just hints) ( Just serverAddr) ( Just $ show serverPort)
105
- sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
103
+ addr <- resolveClient Stream serverAddr serverPort
104
+ sock <- socketWithAddrInfo addr
106
105
#if !defined(mingw32_HOST_OS)
107
106
withFdSocket sock $ \ fd -> do
108
107
getNonBlock fd `shouldReturn` True
@@ -111,12 +110,8 @@ tcp serverAct portVar = defaultClientServer
111
110
connect sock $ addrAddress addr
112
111
return sock
113
112
, serverSetup = do
114
- let hints = defaultHints {
115
- addrFlags = [AI_PASSIVE ]
116
- , addrSocketType = Stream
117
- }
118
- addr: _ <- getAddrInfo (Just hints) (Just serverAddr) Nothing
119
- sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
113
+ addr <- resolveServer Stream serverAddr
114
+ sock <- socketWithAddrInfo addr
120
115
withFdSocket sock $ \ fd -> do
121
116
#if !defined(mingw32_HOST_OS)
122
117
getNonBlock fd `shouldReturn` True
@@ -154,19 +149,16 @@ udp
154
149
-> MVar PortNumber
155
150
-> ClientServer a Socket
156
151
udp clientAct portVar = defaultClientServer
157
- { clientSetup = socket AF_INET Datagram defaultProtocol
152
+ { clientSetup = do
153
+ addr <- resolveClient Datagram serverAddr 8000 -- dummy port
154
+ socketWithAddrInfo addr
158
155
, clientAction = \ sock -> do
159
156
serverPort <- readMVar portVar
160
- let hints = defaultHints { addrFlags = [AI_NUMERICHOST ], addrSocketType = Datagram }
161
- addr: _ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)
157
+ addr <- resolveClient Datagram serverAddr serverPort
162
158
clientAct sock $ addrAddress addr
163
159
, serverSetup = do
164
- let hints = defaultHints {
165
- addrFlags = [AI_PASSIVE ]
166
- , addrSocketType = Datagram
167
- }
168
- addr: _ <- getAddrInfo (Just hints) (Just serverAddr) Nothing
169
- sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
160
+ addr <- resolveServer Datagram serverAddr
161
+ sock <- socketWithAddrInfo addr
170
162
setSocketOption sock ReuseAddr 1
171
163
bind sock $ addrAddress addr
172
164
serverPort <- socketPort sock
@@ -237,3 +229,24 @@ bracketWithReraise :: ThreadId -> IO a -> (a -> IO b) -> (a -> IO ()) -> IO ()
237
229
bracketWithReraise tid setup teardown thing =
238
230
E. bracket setup teardown thing
239
231
`E.catch` \ (e :: E. SomeException ) -> E. throwTo tid e
232
+
233
+ resolveClient :: SocketType -> HostName -> PortNumber -> IO AddrInfo
234
+ resolveClient socketType host port =
235
+ head <$> getAddrInfo (Just hints) (Just host) (Just $ show port)
236
+ where
237
+ hints = defaultHints {
238
+ addrSocketType = socketType
239
+ , addrFlags = [AI_NUMERICHOST ]
240
+ }
241
+
242
+ resolveServer :: SocketType -> HostName -> IO AddrInfo
243
+ resolveServer socketType host =
244
+ head <$> getAddrInfo (Just hints) (Just host) Nothing
245
+ where
246
+ hints = defaultHints {
247
+ addrSocketType = socketType
248
+ , addrFlags = [AI_PASSIVE ]
249
+ }
250
+
251
+ socketWithAddrInfo :: AddrInfo -> IO Socket
252
+ socketWithAddrInfo addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
0 commit comments