ios проблема readDataToLength при использовании GCDAsyncSocket - PullRequest
0 голосов
/ 07 мая 2020

Я получаю заголовок пакета, сначала использую socket.readData (toLength: 5, withTimeout: -1, tag: 0), затем я вычисляю длину тела в делегате didRead и использую socket.readData (toLength: bodySize, withTimeout: - 1, тег: 0) для продолжения приема основного пакета после прочтения основного пакета я снова прочту 5 заголовок,

 public func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {

      if ( (data.count < DATA_HEADER_LENGTH && tag == Scocket_Tag_Header) || data.count == 0 ) { return }
      let type = data[0]
      let aaaa = [UInt8](data)
      print("type \(aaaa)")
      if (type == S_H_RQ_TYPE) {
          self.sendHeartPackage()
          return;
      }
      if ( tag == Scocket_Tag_Header ) {
          let bodyLen = self.getContentSize(bytes: data)
          self.beginReadBody(length: bodyLen , tag: self.getBodyTag(headType: type))
          return
      }else if ( tag == Scocket_Tag_Message_Body ) {
          self.progressMessage(data: data)
      }else if ( tag == Scocket_Tag_Reply_Body ) {
          self.progressReply(data: data)
      }
      self.beginReadHeader()
 }

 func beginReadHeader() {
    self.readData(length: UInt(DATA_HEADER_LENGTH), timeout: -1, tag: Scocket_Tag_Header)
 }

И когда я отправлю данные на сервер, я прочитаю заголовок 5 в didWriteDataWithTag делегат

 public func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
     self.beginReadHeader()
 }

Я отправляю данные на сервер, затем делегат didWriteDataWithTag работает

Теперь я получаю данные с сервера с 5 байтами (правильная длина заголовка), я вычисляю размер тела с 45 и запустить readDataToLength с 45, но случаются странные вещи. Я все равно получаю 5 байтов в следующий раз, когда в первый раз будет 45 байтов [2, 0, 0, 0, 45] размер тела 45 в следующий раз [10, 28, 99 , 111, 110]

Я предлагаю запустить readDataToLength дважды. Есть ли хороший способ решить эту проблему?

...