/Samples/Peer2PeerMasterServer/Program.cs

https://github.com/mauriciocirelli/MonoGame-Samples · C# · 185 lines · 147 code · 23 blank · 15 comment · 17 complexity · 8430134f6cb6c0aa48bfbda05862d58b MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Lidgren.Network;
  5. using System.Net;
  6. /// This is an example Master Server
  7. /// It listens on UDP port 6000 for incomming requests
  8. /// This port will need to be opened on any firewall/router and port farwarded.
  9. namespace Peer2PeerMasterServer
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. Console.WriteLine("Server Started");
  16. Dictionary<IPEndPoint, AvailableGame> registeredHosts = new Dictionary<IPEndPoint, AvailableGame>();
  17. NetPeerConfiguration config = new NetPeerConfiguration("masterserver");
  18. config.SetMessageTypeEnabled(NetIncomingMessageType.UnconnectedData, true);
  19. config.Port = 6000;
  20. NetPeer peer = new NetPeer(config);
  21. peer.Start();
  22. // keep going until ESCAPE is pressed
  23. Console.WriteLine("Press ESC to quit");
  24. while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape)
  25. {
  26. System.Threading.Thread.Sleep(10);
  27. NetIncomingMessage msg;
  28. while ((msg = peer.ReadMessage()) != null)
  29. {
  30. switch (msg.MessageType)
  31. {
  32. case NetIncomingMessageType.UnconnectedData:
  33. //
  34. // We've received a message from a client or a host
  35. //
  36. // by design, the first byte always indicates action
  37. switch (msg.ReadByte())
  38. {
  39. case 0: // register a new game
  40. // currently only one game per host per router.
  41. if (!registeredHosts.ContainsKey(msg.SenderEndpoint))
  42. {
  43. AvailableGame game = new AvailableGame();
  44. game.Count = msg.ReadInt32();
  45. game.GamerTag = msg.ReadString();
  46. game.PrivateGamerSlots = msg.ReadInt32();
  47. game.MaxGamers = msg.ReadInt32();
  48. game.IsHost = msg.ReadBoolean();
  49. game.InternalIP = msg.ReadIPEndpoint();
  50. game.ExternalIP = msg.SenderEndpoint;
  51. game.Game = msg.ReadString();
  52. Console.WriteLine("Got registration for host " + game.ToString());
  53. registeredHosts.Add(game.ExternalIP, game);
  54. }
  55. break;
  56. case 1:
  57. // It's a client wanting a list of registered hosts
  58. Console.WriteLine("Sending list of " + registeredHosts.Count + " hosts to client " + msg.SenderEndpoint);
  59. string appid = msg.ReadString();
  60. foreach (AvailableGame g1 in registeredHosts.Values)
  61. {
  62. if (g1.Game == appid)
  63. {
  64. // send registered host to client
  65. NetOutgoingMessage om = peer.CreateMessage();
  66. om.Write(g1.Count);
  67. om.Write(g1.GamerTag);
  68. om.Write(g1.PrivateGamerSlots);
  69. om.Write(g1.MaxGamers);
  70. om.Write(g1.IsHost);
  71. om.Write(g1.InternalIP);
  72. om.Write(g1.ExternalIP);
  73. peer.SendUnconnectedMessage(om, msg.SenderEndpoint);
  74. }
  75. }
  76. break;
  77. case 2:
  78. // It's a client wanting to connect to a specific (external) host
  79. IPEndPoint clientInternal = msg.ReadIPEndpoint();
  80. IPEndPoint hostExternal = msg.ReadIPEndpoint();
  81. string token = msg.ReadString();
  82. Console.WriteLine(msg.SenderEndpoint + " requesting introduction to " + hostExternal + " (token " + token + ")");
  83. // find in list
  84. foreach (AvailableGame elist in registeredHosts.Values)
  85. {
  86. if (elist.ExternalIP.Equals(hostExternal))
  87. {
  88. // found in list - introduce client and host to eachother
  89. Console.WriteLine("Sending introduction...");
  90. peer.Introduce(
  91. elist.InternalIP, // host internal
  92. elist.ExternalIP, // host external
  93. clientInternal, // client internal
  94. msg.SenderEndpoint, // client external
  95. token // request token
  96. );
  97. break;
  98. }
  99. }
  100. break;
  101. case 3:
  102. if (registeredHosts.ContainsKey(msg.SenderEndpoint))
  103. {
  104. AvailableGame game = registeredHosts[msg.SenderEndpoint];
  105. string tag = msg.ReadString();
  106. string gamename = msg.ReadString();
  107. if (game.GamerTag == tag)
  108. {
  109. Console.WriteLine("Remove for host " + game.ExternalIP.ToString());
  110. registeredHosts.Remove(game.ExternalIP);
  111. }
  112. }
  113. break;
  114. case 4 :
  115. if (registeredHosts.ContainsKey(msg.SenderEndpoint))
  116. {
  117. AvailableGame game = registeredHosts[msg.SenderEndpoint];
  118. int count = msg.ReadInt32();
  119. string tag = msg.ReadString();
  120. if (game.GamerTag == tag)
  121. {
  122. Console.WriteLine("Update for host " + game.ExternalIP.ToString());
  123. game.Count = count;
  124. game.PrivateGamerSlots = msg.ReadInt32();
  125. game.MaxGamers = msg.ReadInt32();
  126. game.IsHost = msg.ReadBoolean();
  127. game.InternalIP = msg.ReadIPEndpoint();
  128. game.Game = msg.ReadString();
  129. }
  130. }
  131. break;
  132. }
  133. break;
  134. case NetIncomingMessageType.DebugMessage:
  135. case NetIncomingMessageType.VerboseDebugMessage:
  136. case NetIncomingMessageType.WarningMessage:
  137. case NetIncomingMessageType.ErrorMessage:
  138. // print diagnostics message
  139. Console.WriteLine(msg.ReadString());
  140. break;
  141. }
  142. }
  143. }
  144. peer.Shutdown("shutting down");
  145. }
  146. }
  147. class AvailableGame
  148. {
  149. public IPEndPoint ExternalIP { get; set; }
  150. public IPEndPoint InternalIP { get; set; }
  151. public int Count { get; set; }
  152. public string GamerTag { get; set; }
  153. public int PrivateGamerSlots { get; set; }
  154. public int MaxGamers { get; set; }
  155. public bool IsHost { get; set; }
  156. public string Game { get; set; }
  157. public override string ToString()
  158. {
  159. return String.Format("External {0}\n Internal \n{1} GamerTag{2}\n", ExternalIP, InternalIP, GamerTag);
  160. }
  161. }
  162. }