@@ -182,3 +182,42 @@ func RecvError(session *kcp.UDPSession) error {
182
182
}
183
183
return nil
184
184
}
185
+
186
+ func NewKcpSession (addr string , key []byte , cmd string ) (session * kcp.UDPSession , err error ) {
187
+ block , err := kcp .NewAESBlockCrypt (key )
188
+ if err != nil {
189
+ return nil , fmt .Errorf ("new aes block crypt failed: %v" , err )
190
+ }
191
+
192
+ done := make (chan struct {}, 1 )
193
+ go func () {
194
+ defer func () {
195
+ if err != nil && session != nil {
196
+ session .Close ()
197
+ }
198
+ done <- struct {}{}
199
+ close (done )
200
+ }()
201
+ session , err = kcp .DialWithOptions (addr , block , 10 , 3 )
202
+ if err != nil {
203
+ err = fmt .Errorf ("kcp dial [%s] [%s] failed: %v" , addr , cmd , err )
204
+ return
205
+ }
206
+ session .SetNoDelay (1 , 10 , 2 , 1 )
207
+ if err = SendCommand (session , cmd ); err != nil {
208
+ err = fmt .Errorf ("kcp send command [%s] [%s] failed: %v" , addr , cmd , err )
209
+ return
210
+ }
211
+ if err = RecvError (session ); err != nil {
212
+ err = fmt .Errorf ("kcp new session [%s] [%s] failed: %v" , addr , cmd , err )
213
+ return
214
+ }
215
+ }()
216
+
217
+ select {
218
+ case <- time .After (10 * time .Second ):
219
+ err = fmt .Errorf ("kcp new session [%s] [%s] timeout" , addr , cmd )
220
+ case <- done :
221
+ }
222
+ return
223
+ }
0 commit comments