void parseMessages() { lock (message_lock_) { while (true) { if (next_decoding_offset_ >= received_size_ - 4) { // Not enough bytes. Wait for more bytes to come. break; } int length = 0; if (BitConverter.IsLittleEndian) { byte[] bytes = new byte [4]; Buffer.BlockCopy(receive_buffer_, next_decoding_offset_, bytes, 0, 4); Array.Reverse(bytes); // gets big endian length = (int)BitConverter.ToUInt32(bytes, 0); } else { length = (int)BitConverter.ToUInt32(receive_buffer_, next_decoding_offset_); } if (length > 0) { int offset = next_decoding_offset_ + 4; if (received_size_ - offset < length) { // Need more bytes for a message body. Waiting. break; } object obj = FunapiDSRpcMessage.Deserialize(new ArraySegment <byte>(receive_buffer_, offset, length)); if (obj != null) { FunDedicatedServerRpcMessage msg = obj as FunDedicatedServerRpcMessage; messages_.Enqueue(msg); #if ENABLE_DEBUG StringBuilder log = new StringBuilder(); log.AppendFormat("[Peer:{0}] [S->C] type={1}, length={2} ", peer_id_, msg.type, length); FunapiDSRpcMessage.DebugString(msg, log); FunDebug.LogDebug(log.ToString()); #endif } next_decoding_offset_ = offset + length; } else { next_decoding_offset_ += 4; } } } }
void onSend() { try { lock (send_lock_) { if (send_queue_.Count <= 0 || sending_.Count > 0) { return; } Queue <FunDedicatedServerRpcMessage> list = send_queue_; send_queue_ = new Queue <FunDedicatedServerRpcMessage>(); foreach (FunDedicatedServerRpcMessage msg in list) { byte[] buf = FunapiDSRpcMessage.Serialize(msg); if (buf == null) { continue; } #if ENABLE_DEBUG StringBuilder log = new StringBuilder(); log.AppendFormat("[Peer:{0}] [C->S] type={1}, length={2} ", peer_id_, msg.type, buf.Length); FunapiDSRpcMessage.DebugString(msg, log); FunDebug.LogDebug(log.ToString()); #endif sending_.Add(new ArraySegment <byte>(buf)); } if (sending_.Count <= 0) { return; } lock (sock_lock_) { if (sock_ == null) { return; } sock_.BeginSend(sending_, SocketFlags.None, new AsyncCallback(this.sendCb), this); } } } catch (Exception e) { logWarning("Sending failed. {0}", e.ToString()); onDisconnect(PeerEventType.kDisconnected); } }