private static void ZSBindAccept(IAsyncResult ar) { Socket _listen = (Socket)ar.AsyncState; try { Socket client = _listen.EndAccept(ar); if (client != null) { int ClientID = client.GetHashCode(); Console.WriteLine("[W] ZoneServer Connected"); ZS_Manager MyZS = new ZS_Manager(ClientID, client); ZS_Clients.Add(MyZS); int GMSClientIndex = GetClientIndex(ClientID); ZS_Clients[GMSClientIndex]._socket.BeginReceive(ZS_Clients[GMSClientIndex].buffer, 0, ZS_Manager.BufferSize, SocketFlags.None, new AsyncCallback(ZSBind_receive), ZS_Clients[GMSClientIndex]); } } catch { return; } finally { _listen.BeginAccept(new AsyncCallback(ZSBindAccept), _listen); } }
public static void SendToZoneServer(ZS_Manager ZS, byte[] data) { try { ZS._socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendZSCallback), ZS._socket); } catch { return; } }
private static void ZSBind_receive(IAsyncResult ar) { byte[] Data; ZS_Manager My_ZS = (ZS_Manager)ar.AsyncState; Socket client = My_ZS._socket; if (client == null) { return; } if (!client.Connected) { return; } int BufferSize = AsyncSocket.getPendingByteCount(client); if (BufferSize > 1000) { return; } try { int BytesReceive = client.EndReceive(ar); if (BytesReceive > 0) { Data = new byte[BytesReceive]; Array.Copy(My_ZS.buffer, Data, BytesReceive); HandleZSReceive(My_ZS, Data); My_ZS.buffer = new byte[ZS_Manager.BufferSize]; } else { DisconnectClientFromID(My_ZS.id); } client.BeginReceive(My_ZS.buffer, 0, ZS_Manager.BufferSize, SocketFlags.None, new AsyncCallback(ZSBind_receive), My_ZS); } catch (SocketException e) { if (e.ErrorCode == 10054) { DisconnectClientFromID(My_ZS.id); //disconnect return; } } catch { DisconnectClientFromID(My_ZS.id); //disconnect return; } }
private static void HandleZSReceive(ZS_Manager My_ZS, byte[] data) { // struct packet zs // 2 bytes - tamanho // 1 byte - packet type // data using (MemoryStream ms = new MemoryStream(data)) { using (BinaryReader br = new BinaryReader(ms, Encoding.UTF8)) { short DataLen = br.ReadInt16(); byte packetType = br.ReadByte(); byte[] Data = br.ReadBytes(DataLen); ParsingZSDataReceived(packetType, Data, My_ZS); br.Close(); } ms.Close(); } }
private static void ParsingZSDataReceived(byte packetType, byte[] packetData, ZS_Manager My_ZS) { switch (packetType) { default: Console.WriteLine("[ZS] Packet type not found!"); break; } }