MCPcopy Create free account
hub / github.com/LagrangeDev/LagrangeGo / sendAndWait

Method sendAndWait

client/network.go:193–233  ·  view source on GitHub ↗

sendAndWait 向服务器发送一个数据包, 并等待返回

(seq uint32, pkt []byte, params ...network.RequestParams)

Source from the content-addressed store, hash-verified

191
192// sendAndWait 向服务器发送一个数据包, 并等待返回
193func (c *QQClient) sendAndWait(seq uint32, pkt []byte, params ...network.RequestParams) (any, error) {
194 type T struct {
195 Response any
196 Error error
197 }
198 ch := make(chan T, 1)
199 var p network.RequestParams
200
201 if len(params) != 0 {
202 p = params[0]
203 }
204
205 c.handlers.Store(seq, &handlerInfo{fun: func(i any, err error) {
206 ch <- T{
207 Response: i,
208 Error: err,
209 }
210 }, params: p, dynamic: false})
211
212 err := c.sendPacket(pkt)
213 if err != nil {
214 c.handlers.Delete(seq)
215 return nil, err
216 }
217
218 retry := 0
219 for {
220 select {
221 case rsp := <-ch:
222 return rsp.Response, rsp.Error
223 case <-time.After(time.Second * 15):
224 retry++
225 if retry < 2 {
226 _ = c.sendPacket(pkt)
227 continue
228 }
229 c.handlers.Delete(seq)
230 return nil, errors.New("Packet timed out")
231 }
232 }
233}
234
235// sendPacket 向服务器发送一个数据包
236func (c *QQClient) sendPacket(pkt []byte) error {

Callers 1

sendUniPacketAndWaitMethod · 0.95

Calls 1

sendPacketMethod · 0.95

Tested by

no test coverage detected