Advertisement
Guest User

Untitled

a guest
Feb 13th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.73 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Threading;
  10. using System.Windows.Forms;
  11. using SteamSDK;
  12. using System.Diagnostics;
  13. using System.Net;
  14.  
  15. namespace SteamAPITest
  16. {
  17. public partial class SteamAPITest : Form
  18. {
  19. public static ulong clientServerId = 0;
  20. public static ulong serverId = 0;
  21. public static ulong clientId = 0;
  22. public static bool started = false;
  23. public static Stopwatch sw = new Stopwatch();
  24. public DateTime startTime = DateTime.MinValue;
  25. public int totalPackets = 0;
  26. public static string debugText = "";
  27. public static DateTime lastDebug = DateTime.MinValue;
  28.  
  29. public SteamAPITest()
  30. {
  31. InitializeComponent();
  32.  
  33. UpdateTimer.Enabled = true;
  34.  
  35. SteamServerAPI.Instance.GameServer.ServersConnected += GameServer_ServersConnected;
  36. SteamServerAPI.Instance.GameServer.ServersConnectFailure += GameServer_ServersConnectFailure;
  37. SteamServerAPI.Instance.GameServer.ServersDisconnected += GameServer_ServersDisconnected;
  38. SteamServerAPI.Instance.GameServer.PolicyResponse += GameServer_PolicyResponse;
  39. SteamServerAPI.Instance.GameServer.ValidateAuthTicketResponse += GameServer_ValidateAuthTicketResponse;
  40. SteamServerAPI.Instance.GameServer.UserGroupStatus += GameServer_UserGroupStatus;
  41.  
  42. Peer2Peer.SessionRequest += Peer2Peer_SessionRequest;
  43. Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed;
  44.  
  45. Thread serverThread = new Thread(RunServerThread);
  46. serverThread.IsBackground = true;
  47. serverThread.Start();
  48.  
  49. Thread clientThread = new Thread(RunClientThread);
  50. clientThread.IsBackground = true;
  51. clientThread.Start();
  52. }
  53.  
  54. public void RunServerThread()
  55. {
  56. bool started = false;
  57. bool done = false;
  58.  
  59. try
  60. {
  61. UInt32 ip = 0;
  62. ulong localServerId = 0;
  63.  
  64. ServerStartResult startResult = SteamSDK.SteamServerAPI.Instance.GameServer.Start(
  65. new System.Net.IPEndPoint(IPAddress.Parse("0.0.0.0"), 11111),
  66. (ushort)11111,
  67. ServerMode.eServerModeAuthenticationAndSecure,
  68. "1121008",
  69. true);
  70.  
  71. if (startResult != ServerStartResult.OK)
  72. {
  73. MessageBox.Show(string.Format("Start result: {0}", startResult.ToString()));
  74. return;
  75. }
  76.  
  77. SteamServerAPI.Instance.GameServer.SetModDir("Space Engineers");
  78. SteamServerAPI.Instance.GameServer.ProductName = "Space Engineers";
  79. SteamServerAPI.Instance.GameServer.GameDescription = "Space Engineers";
  80. SteamServerAPI.Instance.GameServer.SetDedicated(true);
  81. SteamServerAPI.Instance.GameServer.SetServerName("ABCDEFGHIJK");
  82. SteamServerAPI.Instance.GameServer.EnableHeartbeats(true);
  83. SteamServerAPI.Instance.GameServer.LogOnAnonymous();
  84.  
  85. Debug(string.Format("Online: {0}", SteamAPI.Instance != null ? SteamAPI.Instance.IsOnline() : false));
  86.  
  87. started = true;
  88.  
  89. int timeout = 100;
  90. while (ip == 0 && timeout > 0)
  91. {
  92. SteamServerAPI.Instance.GameServer.RunCallbacks();
  93. //SteamAPI.Instance.RunCallbacks();
  94.  
  95. Thread.Sleep(100);
  96. timeout--;
  97.  
  98. ip = SteamServerAPI.Instance.GameServer.GetPublicIP();
  99. localServerId = SteamServerAPI.Instance.GameServer.GetSteamID();
  100.  
  101. }
  102.  
  103. ulong lobbyId = 0;
  104. /*
  105. Lobby.Create(LobbyTypeEnum.Public, 4, (lobby, result) =>
  106. {
  107. if(result != Result.OK)
  108. {
  109. Debug("Unable to create lobby");
  110. return;
  111. }
  112.  
  113. lobbyId = lobby.LobbyId;
  114. done = true;
  115. });
  116.  
  117. while(true)
  118. {
  119. SteamAPI.Instance.RunCallbacks();
  120.  
  121. if (done)
  122. break;
  123.  
  124. Thread.Sleep(10);
  125. }
  126. */
  127.  
  128. string address = IPAddress.Parse(ip.ToString()).ToString();
  129. Debug(string.Format("Server running: IP: {0} ({1}) ID: {2} LobbyID: {3}", address, ip, localServerId, lobbyId));
  130. Invoke(new Action(() =>
  131. {
  132. txtAddress.Text = address.ToString();
  133. }));
  134.  
  135. int count = 0;
  136. int loopCount = 0;
  137. while (true)
  138. {
  139. //if(loopCount % 60 == 0)
  140. SteamServerAPI.Instance.GameServer.RunCallbacks();
  141.  
  142. loopCount++;
  143. //SteamAPI.Instance.RunCallbacks();
  144.  
  145. uint msgSize = 0;
  146. Peer2Peer.IsPacketAvailable(out msgSize, 1);
  147. if (msgSize > 0)
  148. {
  149. byte[] buffer = new byte[100];
  150. uint dataSize = 0;
  151. ulong senderId = 0;
  152.  
  153. while (Peer2Peer.ReadPacket(buffer, out dataSize, out senderId, 1))
  154. //Peer2Peer.ReadPacket(buffer, out dataSize, out senderId, 1);
  155. {
  156. //TimeSpan ts = DateTime.Now - startTime;
  157. if(count == 1)
  158. {
  159. sw.Reset();
  160. sw.Start();
  161. }
  162.  
  163. count++;
  164.  
  165. //if(count % 10 == 0)
  166. Debug(string.Format("TIME:{0:F1}ms : Received packet: \"{2}\" ({3}b)", sw.Elapsed.TotalMilliseconds, dataSize, ASCIIEncoding.ASCII.GetString(buffer, 0, (int)dataSize), dataSize));
  167.  
  168. if (count % 500 == 0)
  169. Debug(string.Format("Time elapsed: {0} - packets received: {1} ({2:F1} packets / s)", sw.Elapsed.TotalSeconds, totalPackets, totalPackets / sw.Elapsed.TotalSeconds));
  170.  
  171. totalPackets++;
  172. }
  173. }
  174.  
  175. Thread.Sleep(0);
  176. }
  177. }
  178. catch (Exception ex)
  179. {
  180. Invoke(new Action(() =>
  181. {
  182. MessageBox.Show(string.Format("Error: {0}", ex.ToString()));
  183. }));
  184. }
  185. finally
  186. {
  187. if (started)
  188. {
  189. SteamServerAPI.Instance.GameServer.RunCallbacks();
  190. SteamServerAPI.Instance.GameServer.EnableHeartbeats(false);
  191. SteamServerAPI.Instance.GameServer.LogOff();
  192. Peer2Peer.CloseSession(serverId);
  193. }
  194. }
  195. }
  196.  
  197. private void Peer2Peer_ConnectionFailed(ulong remoteUserId, P2PSessionErrorEnum error)
  198. {
  199. Debug("Peer2Peer_ConnectionFailed");
  200.  
  201. }
  202.  
  203. private void Peer2Peer_SessionRequest(ulong remoteUserId)
  204. {
  205. Debug("Peer2Peer_SessionRequest");
  206. Peer2Peer.AcceptSession(remoteUserId);
  207. sw.Start();
  208. }
  209.  
  210. private void GameServer_UserGroupStatus(ulong userId, ulong groupId, bool member, bool officier)
  211. {
  212. Debug("GameServer_UserGroupStatus");
  213. }
  214.  
  215. private void GameServer_ValidateAuthTicketResponse(ulong steamID, AuthSessionResponseEnum response, ulong ownerSteamID)
  216. {
  217. Debug("GameServer_ValidateAuthTicketResponse");
  218. }
  219.  
  220. private void GameServer_PolicyResponse(sbyte result)
  221. {
  222. Debug(string.Format("GameServer_PolicyResponse: {0}", result));
  223. }
  224.  
  225. private void GameServer_ServersDisconnected(Result result)
  226. {
  227. Debug("GameServer_ServersDisconnected");
  228. }
  229.  
  230. private void GameServer_ServersConnectFailure(Result result)
  231. {
  232. Debug("GameServer_ServersConnectFailure");
  233. }
  234.  
  235. private void GameServer_ServersConnected()
  236. {
  237. Debug("GameServer_ServersConnected");
  238. }
  239.  
  240. public void RunClientThread()
  241. {
  242. try
  243. {
  244. long count = 0;
  245. while (true)
  246. {
  247. if (SteamAPI.Instance != null)
  248. SteamAPI.Instance.RunCallbacks();
  249.  
  250. if (started)
  251. {
  252. count++;
  253. byte[] buffer = ASCIIEncoding.ASCII.GetBytes(string.Format("Client Test Packet #{0}", count));
  254. Debug(string.Format("Sending Packet: {0}bytes", buffer.Length));
  255. Peer2Peer.SendPacket(clientServerId, buffer, buffer.Length, P2PMessageEnum.UnreliableNoDelay, 1);
  256. }
  257. else
  258. count = 0;
  259.  
  260. if (count == 1)
  261. {
  262. sw.Reset();
  263. sw.Start();
  264. }
  265.  
  266. Thread.Sleep(2);
  267. }
  268. }
  269. catch(Exception ex)
  270. {
  271. MessageBox.Show(string.Format("Exception : {0}", ex.ToString()));
  272. }
  273. finally
  274. {
  275. Peer2Peer.CloseSession(serverId);
  276. }
  277. }
  278.  
  279. unsafe void ServerResponded(GameServerItem serverItem)
  280. {
  281. Debug(string.Format("Server Responded: {0}", serverItem.NetAdr.Address.ToString()));
  282.  
  283. var buffer = new byte[1024];
  284. uint length;
  285. uint ticketHandle;
  286. if(!SteamAPI.Instance.GetAuthSessionTicket(out ticketHandle, buffer, out length))
  287. {
  288. Debug("Failed to get ticket");
  289. return;
  290. }
  291.  
  292. Debug(string.Format("Ticket Auth: {0}", ticketHandle));
  293.  
  294. clientServerId = serverItem.SteamID;
  295. byte[] buf = ASCIIEncoding.ASCII.GetBytes(string.Format("Client Test Packet #0"));
  296. Debug(string.Format("Sending Packet: {0}bytes", buf.Length));
  297. Peer2Peer.SendPacket(clientServerId, buf, buf.Length, P2PMessageEnum.ReliableWithBuffering, 1);
  298. started = true;
  299. Thread.Sleep(3000);
  300. }
  301.  
  302. void ServerFailedToRespond()
  303. {
  304. Debug("Server failed to respond");
  305. }
  306.  
  307. private void Debug(string text)
  308. {
  309. lock(this)
  310. debugText += text + "\r\n";
  311.  
  312. if (DateTime.Now - lastDebug > TimeSpan.FromSeconds(1))
  313. {
  314. BeginInvoke(new Action(() =>
  315. {
  316. txtDebug.Text = debugText;
  317. }));
  318. }
  319.  
  320. lastDebug = DateTime.Now;
  321. }
  322.  
  323. private void UpdateTimer_Tick(object sender, EventArgs e)
  324. {
  325. TimeSpan ts = DateTime.Now - startTime;
  326. //Debug(string.Format("Time elapsed: {0} - packets received: {1} ({2:F1} packets / s)", sw.Elapsed.TotalSeconds, totalPackets, totalPackets / sw.Elapsed.TotalSeconds));
  327. if(txtDebug.Text.Length != debugText.Length)
  328. txtDebug.Text = debugText;
  329. }
  330.  
  331. private void btnStart_Click(object sender, EventArgs e)
  332. {
  333. SteamAPI.Instance.OnPingServerResponded += ServerResponded;
  334. SteamAPI.Instance.OnPingServerFailedToRespond += ServerFailedToRespond;
  335.  
  336. Debug(string.Format("Connecting to server: {0}", txtAddress.Text));
  337. UpdateTimer.Enabled = true;
  338. startTime = DateTime.MinValue;
  339. serverId = 0;
  340.  
  341. IPAddress ip = IPAddress.Parse(txtAddress.Text);
  342. uint unIP = ip.ToIPv4NetworkOrder();
  343. SteamAPI.Instance.PingServer(unIP, 11111);
  344. }
  345.  
  346. private void btnStop_Click(object sender, EventArgs e)
  347. {
  348. Debug("Stopping client");
  349. started = false;
  350. UpdateTimer.Enabled = false;
  351. startTime = DateTime.MinValue;
  352. sw.Stop();
  353. }
  354. }
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement