public Task <byte[]> ReadAsync() { var tcs = new TaskCompletionSource <byte[]>(); // 如果有缓存的包,从缓存中取 if (this.recvBuffer.Count > 0) { var bytes = this.recvBuffer.First.Value; this.recvBuffer.RemoveFirst(); tcs.TrySetResult(bytes); } // 没有缓存封包,设置回调等待 else { this.Received = eEvent => { if (eEvent.EventState == EventState.DISCONNECTED) { tcs.TrySetException(new EException("socket disconnected in receive")); } using (var packet = new EPacket(eEvent.PacketPtr)) { var bytes = packet.Bytes; tcs.TrySetResult(bytes); } }; } return(tcs.Task); }
public void ReadAsync(Action <byte[], int> action) { // 如果有缓存的包,从缓存中取 if (this.recvBuffer.Count > 0) { var bytes = this.recvBuffer.First.Value; this.recvBuffer.RemoveFirst(); action(bytes, 0); } // 没有缓存封包,设置回调等待 else { this.Received = eEvent => { if (eEvent.EventState == EventState.DISCONNECTED) { action(new byte[0], -1); } using (var packet = new EPacket(eEvent.PacketPtr)) { var bytes = packet.Bytes; action(bytes, 0); } }; } }
public void WriteAsync(byte[] data, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable) { var packet = new EPacket(data, flags); NativeMethods.EnetPeerSend(this.peerPtr, channelID, packet.PacketPtr); // enet_peer_send函数会自动删除packet,设置为0,防止Dispose或者析构函数再次删除 packet.PacketPtr = IntPtr.Zero; }
internal void OnReceived(EEvent eEvent) { // 如果应用层还未调用readasync则将包放到缓存队列 if (this.Received == null) { using (var packet = new EPacket(eEvent.PacketPtr)) { var bytes = packet.Bytes; this.recvBuffer.AddLast(bytes); } } else { Action <EEvent> localReceived = this.Received; this.Received = null; // 此调用将让await ReadAsync返回,所以null必须在此之前设置 localReceived(eEvent); } }