Program.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Net.WebSockets;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace WebSocketForwardClient
  8. {
  9. internal class Program
  10. {
  11. private static string _url;
  12. private const int KiB = 1024;
  13. private const int MiB = 1024 * KiB;
  14. private const int BufferSize = MiB;
  15. private static void Main(string[] args)
  16. {
  17. _url = args[0];
  18. var fwSvr = new TcpListener(IPAddress.Any, int.Parse(args[1]));
  19. fwSvr.Start();
  20. Console.WriteLine("Listening on: " + fwSvr.Server.LocalEndPoint);
  21. while (true)
  22. {
  23. var handleRequest = HandleRequest(fwSvr.AcceptTcpClient());
  24. }
  25. }
  26. private static int _connectionId = 0;
  27. private static async Task HandleRequest(TcpClient client)
  28. {
  29. var cid = Interlocked.Increment(ref _connectionId);
  30. Console.WriteLine($"#{cid} Accept From: " + client.Client.RemoteEndPoint);
  31. var ws = new ClientWebSocket();
  32. try
  33. {
  34. await ws.ConnectAsync(new Uri(_url), CancellationToken.None);
  35. }
  36. catch (Exception e)
  37. {
  38. Console.WriteLine($"#{cid} Connection error: {e}");
  39. client.Close();
  40. return;
  41. }
  42. Console.WriteLine($"#{cid} Connected ");
  43. var ns = client.GetStream();
  44. var tIn = Task.Run(async () =>
  45. {
  46. var buf = new byte[BufferSize];
  47. var arrSeg = new ArraySegment<byte>(buf);
  48. while (true)
  49. {
  50. var r = await ws.ReceiveAsync(arrSeg, CancellationToken.None);
  51. await ns.WriteAsync(buf, 0, r.Count);
  52. //Console.WriteLine($"#{cid} WS -> CL {r.Count}");
  53. if (r.Count == 0) break;
  54. }
  55. });
  56. var tOut = Task.Run(async () =>
  57. {
  58. var buf = new byte[BufferSize];
  59. while (true)
  60. {
  61. var count = await ns.ReadAsync(buf, 0, buf.Length);
  62. var arrSeg = new ArraySegment<byte>(buf, 0, count);
  63. await ws.SendAsync(arrSeg, WebSocketMessageType.Binary, true, CancellationToken.None);
  64. //Console.WriteLine($"#{cid} CL -> WS {count}");
  65. }
  66. });
  67. Task.WaitAny(tIn, tOut);
  68. client.Close();
  69. }
  70. }
  71. }