Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.13 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Windows.Forms;
  8.  
  9. namespace BlabberIM
  10. {
  11.     public class Session
  12.     {
  13.         public Socket mSocket;
  14.         private byte[] buffer;
  15.  
  16.         public delegate void DOnDisconnect();
  17.         public event DOnDisconnect OnDisconnect;
  18.         public bool mConnected = false;
  19.         private bool isSize { get; set; }
  20.         private int mReceived = 0;
  21.         PacketHandler mPacketHandler = new PacketHandler();
  22.  
  23.         public Session()
  24.         {
  25.             Console.WriteLine("Session created. {0}", Environment.StackTrace);
  26.         }
  27.  
  28.         public void Connect(string pServerIP, ushort pServerPort)
  29.         {
  30.             isSize = true;
  31.             mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  32.             mSocket.BeginConnect(pServerIP, pServerPort, new AsyncCallback(OnConnected), null);
  33.         }
  34.  
  35.         private void OnConnected(IAsyncResult ar)
  36.         {
  37.             try
  38.             {
  39.                 mSocket.EndConnect(ar);
  40.                 mConnected = true;
  41.  
  42.                 Program.PerformLogin();
  43.  
  44.                 mSocket.BeginReceive(buffer = new byte[4], 0, 4, SocketFlags.None, new AsyncCallback(ParseHeader), mSocket);
  45.             }
  46.             catch (SocketException ex)
  47.             {
  48.                 switch (ex.SocketErrorCode)
  49.                 {
  50.                     case SocketError.TimedOut:
  51.                         Program.ShowLoginError("Connection failed: Connection timed out. Please try again later.", "Connection failure");
  52.                         break;
  53.                     case SocketError.ConnectionRefused:
  54.                         Program.ShowLoginError("The server is currently offline. Please try again later.", "Connection failure");
  55.                         break;
  56.                     /*case SocketError.AccessDenied:
  57.                         break;
  58.                     case SocketError.ConnectionAborted:
  59.                         break;
  60.                     case SocketError.HostDown:
  61.                         break;
  62.                     case SocketError.HostNotFound:
  63.                         break;
  64.                     case SocketError.HostUnreachable:
  65.                         break;
  66.                     case SocketError.IsConnected:
  67.                         break;*/
  68.                     default:
  69.                         Program.ShowLoginError("Connection failed due to an unknown reason/error: " + ex.SocketErrorCode.ToString() + Environment.NewLine + ex.Message, "Connection failure"); break;
  70.          
  71.                 }
  72.  
  73.                 Program.loginForm.Invoke((MethodInvoker)delegate {
  74.                     Program.loginForm.loginButton.Enabled = true;
  75.                     Program.loginForm.loginButton.Text = "Login";
  76.                 });
  77.             }
  78.         }
  79.         public void Disconnect()
  80.         {
  81.             if (mConnected)
  82.             {
  83.                 Console.WriteLine("Disconnecting or disconnected from server. Stacktrace {0}", Environment.StackTrace);
  84.                 mConnected = false;
  85.                 if (OnDisconnect != null)
  86.                 {
  87.                     OnDisconnect();
  88.                 }
  89.                 try
  90.                 {
  91.                     mSocket.Shutdown(SocketShutdown.Both);
  92.                     mSocket.Close();
  93.                 }
  94.                 catch { }
  95.  
  96.             }
  97.         }
  98.  
  99.         void ParseHeader(IAsyncResult ar)
  100.         {
  101.             try
  102.             {
  103.                 int len = mSocket.EndReceive(ar);
  104.                 if (len < (isSize ? 4 : 2))
  105.                 {
  106.                     Disconnect();
  107.                     return;
  108.                 }
  109.                 int nextReceiveLength = 4;
  110.                 mReceived += len;
  111.                 if (isSize)
  112.                 {
  113.                     nextReceiveLength = BitConverter.ToInt32(buffer, 0);
  114.                     isSize = false;
  115.                     mReceived = 0;
  116.                     buffer = new byte[nextReceiveLength];
  117.                 }
  118.                 else
  119.                 {
  120.                     if (mReceived == buffer.Length){
  121.                         Packet packet = new Packet(buffer);
  122.                         Handle(this, packet);
  123.                         isSize = true;
  124.                         mReceived = 0;
  125.                         buffer = new byte[nextReceiveLength];
  126.                     }
  127.                 }
  128.                 mSocket.BeginReceive(buffer, mReceived, buffer.Length - mReceived, SocketFlags.None, new AsyncCallback(ParseHeader), mSocket);
  129.             }
  130.             catch (Exception ex)
  131.             {
  132.                 Console.WriteLine(ex.ToString());
  133.                 Disconnect();
  134.             }
  135.            
  136.         }
  137.  
  138.         void ParseData(IAsyncResult ar)
  139.         {
  140.             if (!mConnected) return;
  141.             try
  142.             {
  143.                 int len = mSocket.EndReceive(ar);
  144.                 if (len <= 0)
  145.                 {
  146.                     Disconnect();
  147.                     return;
  148.                 }
  149.                 byte[] realData = new byte[buffer.Length - 4];
  150.                 Buffer.BlockCopy(buffer, 4, realData, 0, buffer.Length - 4);
  151.                 Packet lPacket = new Packet(realData);
  152.                 Handle(this, lPacket);
  153.                 mSocket.BeginReceive(buffer = new byte[4], 0, 4, SocketFlags.None, new AsyncCallback(ParseHeader), mSocket);
  154.             }
  155.             catch
  156.             {
  157.                 Disconnect();
  158.             }
  159.         }
  160.         public void Handle(Session session, Packet packet)
  161.         {
  162.             mPacketHandler.GetHandler(packet.Opcode).OnPacket(packet, session);
  163.         }
  164.         public void SendPacket(Packet packet)
  165.         {
  166.             if (!mConnected)
  167.                 return;
  168.             byte[] data = packet.GetPacket();
  169.             Console.WriteLine("TRying to send packet... Length {0}, Data: {1}", data.Length, data.ToReadableByteArray());
  170.             try
  171.             {
  172.                 mSocket.Send(data);
  173.             }
  174.             catch
  175.             {
  176.                
  177.             }
  178.         }
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement