UChannel.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Base
  5. {
  6. internal class UChannel: AChannel
  7. {
  8. private USocket socket;
  9. private readonly string remoteAddress;
  10. public UChannel(USocket socket, string host, int port, UService service): base(service)
  11. {
  12. this.socket = socket;
  13. this.service = service;
  14. this.remoteAddress = host + ":" + port;
  15. }
  16. public override void Dispose()
  17. {
  18. if (this.Id == 0)
  19. {
  20. return;
  21. }
  22. base.Dispose();
  23. this.socket.Dispose();
  24. }
  25. public override void ConnectAsync()
  26. {
  27. string[] ss = this.remoteAddress.Split(':');
  28. ushort port = ushort.Parse(ss[1]);
  29. this.socket.ConnectAsync(ss[0], port);
  30. }
  31. public override void Send(byte[] buffer, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable)
  32. {
  33. this.socket.SendAsync(buffer, channelID, flags);
  34. }
  35. public override void Send(List<byte[]> buffers, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable)
  36. {
  37. int size = buffers.Select(b => b.Length).Sum();
  38. var buffer = new byte[size];
  39. int index = 0;
  40. foreach (byte[] bytes in buffers)
  41. {
  42. Array.Copy(bytes, 0, buffer, index, bytes.Length);
  43. index += bytes.Length;
  44. }
  45. this.socket.SendAsync(buffer, channelID, flags);
  46. }
  47. public override byte[] Recv()
  48. {
  49. if (this.socket?.RecvQueue.Count == 0)
  50. {
  51. return null;
  52. }
  53. return this.socket?.RecvQueue.Dequeue();
  54. }
  55. }
  56. }