@@ -18,6 +18,7 @@ import (
18
18
"bufio"
19
19
"context"
20
20
"fmt"
21
+ "log"
21
22
"net"
22
23
"strings"
23
24
"time"
@@ -29,7 +30,10 @@ type connectionRequest struct {
29
30
err error
30
31
}
31
32
32
- func simpleTCPServer (ctx context.Context , ms * Microservice , addr string , expReqMsg , respMsg string , done chan <- error ) {
33
+ func simpleTCPServer (ctx context.Context , ms * Microservice , addr string , expReqMsg , respMsg string , done chan <- error , logger * log.Logger ) {
34
+ defer func () {
35
+ done <- nil
36
+ }()
33
37
// move to the network namespace where server should listen
34
38
exitNetNs := ms .enterNetNs ()
35
39
defer exitNetNs ()
@@ -45,6 +49,10 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
45
49
newConn := make (chan connectionRequest , 1 )
46
50
go func () {
47
51
conn , err := listener .Accept ()
52
+ if err != nil {
53
+ err = fmt .Errorf ("accept failed with: %v" , err )
54
+ logger .Println (err )
55
+ }
48
56
newConn <- connectionRequest {conn : conn , err : err }
49
57
close (newConn )
50
58
}()
@@ -57,7 +65,7 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
57
65
return
58
66
case cr = <- newConn :
59
67
if cr .err != nil {
60
- done <- fmt . Errorf ( "accept failed with: %v" , cr .err )
68
+ done <- cr .err
61
69
return
62
70
}
63
71
defer cr .conn .Close ()
@@ -70,20 +78,26 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
70
78
// receive message from the client
71
79
message , err := bufio .NewReader (cr .conn ).ReadString ('\n' )
72
80
if err != nil {
73
- commRv <- fmt .Errorf ("failed to read data from client: %v" , err )
81
+ err = fmt .Errorf ("failed to read data from client: %v" , err )
82
+ logger .Println (err )
83
+ commRv <- err
74
84
return
75
85
}
76
86
// send response to the client
77
87
_ , err = cr .conn .Write ([]byte (respMsg + "\n " ))
78
88
if err != nil {
79
- commRv <- fmt .Errorf ("failed to send data to client: %v" , err )
89
+ err = fmt .Errorf ("failed to send data to client: %v" , err )
90
+ logger .Println (err )
91
+ commRv <- err
80
92
return
81
93
}
82
94
// check if the exchanged data are as expected
83
95
message = strings .TrimRight (message , "\n " )
84
96
if message != expReqMsg {
85
- commRv <- fmt .Errorf ("unexpected message received from client ('%s' vs. '%s')" ,
97
+ err = fmt .Errorf ("unexpected message received from client ('%s' vs. '%s')" ,
86
98
message , expReqMsg )
99
+ logger .Println (err )
100
+ commRv <- err
87
101
return
88
102
}
89
103
commRv <- nil
@@ -102,13 +116,18 @@ func simpleTCPServer(ctx context.Context, ms *Microservice, addr string, expReqM
102
116
<- ctx .Done ()
103
117
}
104
118
105
- func simpleUDPServer (ctx context.Context , ms * Microservice , addr string , expReqMsg , respMsg string , done chan <- error ) {
119
+ func simpleUDPServer (ctx context.Context , ms * Microservice , addr string , expReqMsg , respMsg string , done chan <- error , ready chan <- error , logger * log.Logger ) {
120
+ defer func () {
121
+ done <- nil
122
+ }()
123
+
106
124
const maxBufferSize = 1024
107
125
// move to the network namespace where server should listen
108
126
exitNetNs := ms .enterNetNs ()
109
127
defer exitNetNs ()
110
128
111
129
conn , err := net .ListenPacket ("udp" , addr )
130
+ ready <- err
112
131
if err != nil {
113
132
done <- err
114
133
return
@@ -123,21 +142,27 @@ func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqM
123
142
buffer := make ([]byte , maxBufferSize )
124
143
n , addr , err := conn .ReadFrom (buffer )
125
144
if err != nil {
126
- commRv <- fmt .Errorf ("failed to read data from client: %v" , err )
145
+ err = fmt .Errorf ("failed to read data from client: %v" , err )
146
+ logger .Println (err )
147
+ commRv <- err
127
148
return
128
149
}
129
150
message := string (buffer [:n ])
130
151
// send response to the client
131
152
_ , err = conn .WriteTo ([]byte (respMsg + "\n " ), addr )
132
153
if err != nil {
133
- commRv <- fmt .Errorf ("failed to send data to client: %v" , err )
154
+ err = fmt .Errorf ("failed to send data to client: %v" , err )
155
+ logger .Println (err )
156
+ commRv <- err
134
157
return
135
158
}
136
159
// check if the exchanged data are as expected
137
160
message = strings .TrimRight (message , "\n " )
138
161
if message != expReqMsg {
139
- commRv <- fmt .Errorf ("unexpected message received from client ('%s' vs. '%s')" ,
162
+ err = fmt .Errorf ("unexpected message received from client ('%s' vs. '%s')" ,
140
163
message , expReqMsg )
164
+ logger .Println (err )
165
+ commRv <- err
141
166
return
142
167
}
143
168
commRv <- nil
@@ -156,7 +181,7 @@ func simpleUDPServer(ctx context.Context, ms *Microservice, addr string, expReqM
156
181
<- ctx .Done ()
157
182
}
158
183
159
- func simpleTCPClient (ms * Microservice , addr string , reqMsg , expRespMsg string , timeout time.Duration , done chan <- error ) {
184
+ func simpleTCPClient (ms * Microservice , addr string , reqMsg , expRespMsg string , timeout time.Duration , done chan <- error , logger * log. Logger ) {
160
185
// try to connect with the server
161
186
newConn := make (chan connectionRequest , 1 )
162
187
@@ -171,16 +196,20 @@ func simpleTCPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, t
171
196
time .Sleep (checkPollingInterval )
172
197
continue
173
198
}
199
+ if err != nil {
200
+ err = fmt .Errorf ("dial failed with: %v" , err )
201
+ logger .Println (err )
202
+ }
174
203
newConn <- connectionRequest {conn : conn , err : err }
175
204
break
176
205
}
177
206
close (newConn )
178
207
}()
179
208
180
- simpleTCPOrUDPClient (newConn , addr , reqMsg , expRespMsg , timeout , done )
209
+ simpleTCPOrUDPClient (newConn , addr , reqMsg , expRespMsg , timeout , done , logger )
181
210
}
182
211
183
- func simpleUDPClient (ms * Microservice , addr string , reqMsg , expRespMsg string , timeout time.Duration , done chan <- error ) {
212
+ func simpleUDPClient (ms * Microservice , addr string , reqMsg , expRespMsg string , timeout time.Duration , done chan <- error , srvReady chan error , logger * log. Logger ) {
184
213
// try to connect with the server
185
214
newConn := make (chan connectionRequest , 1 )
186
215
@@ -190,27 +219,40 @@ func simpleUDPClient(ms *Microservice, addr string, reqMsg, expRespMsg string, t
190
219
defer exitNetNs ()
191
220
udpAddr , err := net .ResolveUDPAddr ("udp" , addr )
192
221
if err != nil {
222
+ err = fmt .Errorf ("dial failed with: %v" , err )
223
+ logger .Println (err )
193
224
newConn <- connectionRequest {conn : nil , err : err }
194
225
} else {
195
226
start := time .Now ()
196
- for {
197
- conn , err := net .DialUDP ("udp" , nil , udpAddr )
198
- if err != nil && time .Since (start ) < timeout {
199
- time .Sleep (checkPollingInterval )
200
- continue
227
+ err = <- srvReady
228
+ if err != nil {
229
+ err = fmt .Errorf ("dial failed with: %v" , "server not ready" )
230
+ logger .Println (err )
231
+ newConn <- connectionRequest {conn : nil , err : err }
232
+ } else {
233
+ for {
234
+ conn , err := net .DialUDP ("udp" , nil , udpAddr )
235
+ if err != nil && time .Since (start ) < timeout {
236
+ time .Sleep (checkPollingInterval )
237
+ continue
238
+ }
239
+ if err != nil {
240
+ err = fmt .Errorf ("dial failed with: %v" , err )
241
+ logger .Println (err )
242
+ }
243
+ newConn <- connectionRequest {conn : conn , err : err }
244
+ break
201
245
}
202
- newConn <- connectionRequest {conn : conn , err : err }
203
- break
204
246
}
205
247
}
206
248
close (newConn )
207
249
}()
208
250
209
- simpleTCPOrUDPClient (newConn , addr , reqMsg , expRespMsg , timeout , done )
251
+ simpleTCPOrUDPClient (newConn , addr , reqMsg , expRespMsg , timeout , done , logger )
210
252
}
211
253
212
254
func simpleTCPOrUDPClient (newConn chan connectionRequest , addr , reqMsg , expRespMsg string ,
213
- timeout time.Duration , done chan <- error ) {
255
+ timeout time.Duration , done chan <- error , logger * log. Logger ) {
214
256
215
257
// wait for connection
216
258
var cr connectionRequest
@@ -220,7 +262,7 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
220
262
return
221
263
case cr = <- newConn :
222
264
if cr .err != nil {
223
- done <- fmt . Errorf ( "dial failed with: %v" , cr .err )
265
+ done <- cr .err
224
266
return
225
267
}
226
268
defer cr .conn .Close ()
@@ -234,7 +276,9 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
234
276
// send message to the server
235
277
_ , err := cr .conn .Write ([]byte (reqMsg + "\n " ))
236
278
if err != nil {
237
- commRv <- fmt .Errorf ("failed to send data to the server: %v" , err )
279
+ err = fmt .Errorf ("failed to send data to the server: %v" , err )
280
+ logger .Println (err )
281
+ commRv <- err
238
282
return
239
283
}
240
284
// listen for reply
@@ -247,16 +291,20 @@ func simpleTCPOrUDPClient(newConn chan connectionRequest, addr, reqMsg, expRespM
247
291
continue
248
292
}
249
293
if err != nil {
250
- commRv <- fmt .Errorf ("failed to read data from server: %v" , err )
294
+ err = fmt .Errorf ("failed to read data from server: %v" , err )
295
+ logger .Println (err )
296
+ commRv <- err
251
297
return
252
298
}
253
299
break
254
300
}
255
301
// check if the exchanged data are as expected
256
302
message = strings .TrimRight (message , "\n " )
257
303
if message != expRespMsg {
258
- commRv <- fmt .Errorf ("unexpected message received from server ('%s' vs. '%s')" ,
304
+ err = fmt .Errorf ("unexpected message received from server ('%s' vs. '%s')" ,
259
305
message , expRespMsg )
306
+ logger .Println (err )
307
+ commRv <- err
260
308
return
261
309
}
262
310
0 commit comments