LoginRealm.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Net.Sockets;
  3. using GalaSoft.MvvmLight.Threading;
  4. using System.Security.Cryptography;
  5. using System.Threading.Tasks;
  6. using System.Text;
  7. namespace Egametang
  8. {
  9. enum RealmOpcode
  10. {
  11. REALM_AUTH_LOGON_CHALLENGE = 0x0000,
  12. REALM_AUTH_LOGON_PROOF = 0x0001,
  13. AUTH_RECONNECT_CHALLENGE = 0x02,
  14. AUTH_RECONNECT_PROOF = 0x03,
  15. AUTH_LOGON_PERMIT = 0x04,
  16. REALM_LIST = 0x10,
  17. SURVEY = 48,
  18. }
  19. class LoginRealm
  20. {
  21. private MainViewModel mainViewModel = null;
  22. public LoginRealm(MainViewModel mainViewModel)
  23. {
  24. this.mainViewModel = mainViewModel;
  25. }
  26. public async void Login()
  27. {
  28. using (TcpClient tcpClient = new TcpClient())
  29. {
  30. // 异步连接
  31. await tcpClient.ConnectAsync("192.168.10.246", 19000);
  32. var stream = tcpClient.GetStream();
  33. // 验证通行证
  34. await LoginPermit(stream);
  35. }
  36. }
  37. public async Task LoginPermit(NetworkStream stream)
  38. {
  39. byte[] opcodeBuffer = System.BitConverter.GetBytes((Int32)RealmOpcode.AUTH_LOGON_PERMIT);
  40. await stream.WriteAsync(opcodeBuffer, 0, opcodeBuffer.Length);
  41. string username = "egametang@163.com";
  42. username += new string(' ', 128 - username.Length);
  43. byte[] usernameBuffer = System.Text.Encoding.Default.GetBytes(username);
  44. await stream.WriteAsync(usernameBuffer, 0, usernameBuffer.Length);
  45. MD5 md5 = new MD5CryptoServiceProvider();
  46. byte[] password = System.Text.Encoding.Default.GetBytes("163bio1");
  47. byte[] passMD5Buffer = md5.ComputeHash(password);
  48. string passMD5 = BitConverter.ToString(passMD5Buffer);
  49. passMD5 = passMD5.Replace("-", "");
  50. passMD5 = passMD5.ToLower();
  51. App.Logger.Debug("passMD5: " + passMD5);
  52. passMD5Buffer = System.Text.Encoding.Default.GetBytes(passMD5);
  53. await stream.WriteAsync(passMD5Buffer, 0, passMD5Buffer.Length);
  54. await DispatcherHelper.UIDispatcher.InvokeAsync(new Action(() =>
  55. {
  56. mainViewModel.LoginResult = "Login Permit!";
  57. }));
  58. }
  59. }
  60. }