public static void SendResponseEnterServer(ClientManager MyClient) { int len = 0; using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter bw = new BinaryWriter(ms, Encoding.UTF8)) { bw.Write((byte)28); // packet type bw.Write((Int32)MyClient.data.id_idx); Random rand = new Random(); MyClient.data.GMS_TOKEN = rand.Next((int)0xffffff); bw.Write((Int32)MyClient.data.GMS_TOKEN); GMS_bind.SendToGMSAuth(MyClient.data.username, MyClient.data.id_idx, MyClient.data.GMS_TOKEN); len = (int)bw.BaseStream.Length; } byte[] content = ms.GetBuffer(); Array.Resize(ref content, len); MakePacketAndSend(MyClient, content); ClientFunctions.DisconnectClientFromID(MyClient.id); } }
private static void AcceptConnection(IAsyncResult ar) { Socket _listen = (Socket)ar.AsyncState; try { Socket client = _listen.EndAccept(ar); if (client != null) { int ClientID = client.GetHashCode(); if (!ClientFunctions.ClientIdExist(ClientID)) { //Console.WriteLine("[+] Client is Connected: " + client.LocalEndPoint.ToString()); ClientManager MyClient = new ClientManager(ClientID, client); Init.Clients.Add(MyClient); //Console.WriteLine("[+] Client added to list!"); if (MyClient != null) { int ClientIndex = ClientFunctions.GetClientIndex(ClientID); if (ClientIndex != -1) { //Console.WriteLine(" [+] Client listening packets ..."); Init.Clients[ClientIndex]._socket.BeginReceive(Init.Clients[ClientIndex].buffer, 0, ClientManager.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), Init.Clients[ClientIndex]); } } else { Console.WriteLine("[-] Client in list does not exist!"); } } else { // report error // cloned client id hash code Console.WriteLine("[-] Already exist client id: " + ClientID); } } } catch { // add to log Accept Connection error return; } finally { _listen.BeginAccept(new AsyncCallback(AcceptConnection), _listen); } }
private static void ReceiveCallback(IAsyncResult ar) { byte[] Data; ClientManager MyClient = (ClientManager)ar.AsyncState; Socket client = MyClient._socket; if (client == null) { return; } if (!client.Connected) { return; } int BufferSize = getPendingByteCount(client); if (BufferSize > 1000) { return; } try { int BytesReceive = client.EndReceive(ar); if (BytesReceive > 0) { Data = new byte[BytesReceive]; Array.Copy(MyClient.buffer, Data, BytesReceive); ReceiveData.ParsePacket(MyClient, Data); MyClient.buffer = new byte[ClientManager.BufferSize]; // Process received data } else { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); } client.BeginReceive(MyClient.buffer, 0, ClientManager.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), MyClient); } catch (SocketException e) { if (e.ErrorCode == 10054) { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); //Console.WriteLine("Client disconnected!"); return; } } catch { ClientFunctions.DisconnectClientFromID(MyClient.id); ClientFunctions.RemoveClientFromInstance(MyClient); //Console.WriteLine("Client disconnected!"); // add to log receive error // remove client connected if is a error: remove from clients list // return; } }