void ReceiveCallbackConnection(IAsyncResult ar) { try { socket.BeginReceiveFrom(State.receive_buffer, 0, State.BufSize, SocketFlags.None, ref epFrom, recv, state); //Debug.LogError("Attemp Connect function"); //string receivedMessage = Encoding.ASCII.GetString(State.receive_buffer, 0, bytesLen); //Debug.Log(receivedMessage); bool[] receivedMessageBits = StaicBitFunctions.Byte2Bool(State.receive_buffer); //PrintValues(receivedMessage, 0); int currentIndex = 0; int bitLenType = (int)StaicBitFunctions.CountBits((int)Packet.PacketType.NumberOfValues); bool[] packetLenBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, bitLenType); int packetType = (int)StaicBitFunctions.BitArrayToUInt(packetLenBits); bool[] packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 7); uint res = StaicBitFunctions.BitArrayToUInt(packetInBits); // package lenght for data check //Debug.Log(res); bytesLen = socket.EndReceiveFrom(ar, ref epFrom); if (bytesLen > 0 && res == bytesLen) { if (packetType == (int)Packet.PacketType.ServerCommand) { int commandLen = (int)StaicBitFunctions.CountBits((int)ServerPacket.ServerCommand.ConnectedOther); // last element of enum packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, commandLen); res = StaicBitFunctions.BitArrayToUInt(packetInBits); // command num //Debug.Log("result: " + res); if ((int)ServerPacket.ServerCommand.Connected == (int)res) { packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 7); res = StaicBitFunctions.BitArrayToUInt(packetInBits); UDPConnectionManager.maxPlayers = (int)res; //Debug.Log("max players: " + res); int len = (int)StaicBitFunctions.CountBits((int)res); packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, len); res = StaicBitFunctions.BitArrayToUInt(packetInBits); int custId = (int)res; packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 7); len = (int)StaicBitFunctions.BitArrayToUInt(packetInBits); packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, len); res = StaicBitFunctions.BitArrayToUInt(packetInBits); spawnId = (int)res; //UDPPManager.ActivatePlayer(custId.ToString()); id = custId; recv = new AsyncCallback(ReceiveCallback); serverConnectionState = ConnectionState.Connected; Debug.Log("connected"); MainThreadManager.ExecuteOnMainThread(delegate { mainPlayer.SetPlayerId(custId); mainPlayer.ActivatePlayerReceivers(); mainPlayer.ActivateSender(); UDPPlayerManager.ActivatePlayer(custId.ToString()); m_connectedToServer.Invoke(true); }); isDisconnected = false; //Debug.Log("Should print"); //Debug.Log("connection id:" + custId); } else if ((int)ServerPacket.ServerCommand.Full == (int)res) { Debug.Log("Server Is full"); MainThreadManager.ExecuteOnMainThread(delegate { m_connectedToServer.Invoke(false); }); serverConnectionState = ConnectionState.ServerIsFull; } else if ((int)ServerPacket.ServerCommand.ConnectOther == (int)res) // new command for server other connections { int len = (int)StaicBitFunctions.CountBits(UDPConnectionManager.maxPlayers); packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, len); uint lenRes = StaicBitFunctions.BitArrayToUInt(packetInBits); int playerCountConnected = (int)lenRes; //Debug.Log("connected players: " + playerCountConnected); if (playerCountConnected > 0) { for (int length = 0; length < playerCountConnected; length++) // 0 cant exist as player index { packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, len); res = StaicBitFunctions.BitArrayToUInt(packetInBits); int custId = (int)res; //UDPPManager.ActivatePlayer(custId.ToString()); MainThreadManager.ExecuteOnMainThread(delegate { UDPPlayerManager.ActivatePlayer(custId.ToString()); }); //Debug.Log("connect other id:" + custId); } } } } } else { //Debug.LogError("Packet Dropped"); // harmeless error } } catch (Exception e) { //string str = e.ToString(); MainThreadManager.ExecuteOnMainThread(delegate { m_connectedToServer.Invoke(false); }); serverConnectionState = ConnectionState.ServerTimeout; Debug.Log(e); } }
void ReceiveCallback(IAsyncResult ar) { try { //State.receive_buffer = new byte[State.BufSize]; socket.BeginReceiveFrom(State.receive_buffer, 0, State.BufSize, SocketFlags.None, ref epFrom, recv, state); //string receivedMessage = Encoding.ASCII.GetString(State.receive_buffer, 0, bytesLen); //Debug.Log(receivedMessage); int currentIndex = 0; bool[] receivedMessageBits = StaicBitFunctions.Byte2Bool(State.receive_buffer); int bitLenType = (int)StaicBitFunctions.CountBits((int)Packet.PacketType.NumberOfValues); bool[] packetLenBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, bitLenType); int packetType = (int)StaicBitFunctions.BitArrayToUInt(packetLenBits); //PrintValues(receivedMessage, 0); packetLenBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 7); uint res = StaicBitFunctions.BitArrayToUInt(packetLenBits); // package lenght for data check bytesLen = socket.EndReceiveFrom(ar, ref epFrom); if (bytesLen > 0 && res == bytesLen) { if (packetType == (int)Packet.PacketType.User) { PacketHeader receivedMessage = new PacketHeader(State.receive_buffer); string prefix = receivedMessage.GetPrefix(); int playerId = receivedMessage.GetSenderId(); //Debug.Log(prefix); if (messageHandler.ContainsKey(prefix)) { //Thread thread; //thread = new Thread(() => UDPPManager.AddMessage(prefix, playerId.ToString(), receivedMessage)); //thread.Start(); //Debug.LogError("it should work"); ThreadManager.AddOneTimeAction(delegate { UDPPlayerManager.AddMessage(prefix, playerId.ToString(), receivedMessage); }); } } else { int commandLen = (int)StaicBitFunctions.CountBits((int)ServerPacket.ServerCommand.ConnectedOther); // last element of enum bool[] packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, commandLen); res = StaicBitFunctions.BitArrayToUInt(packetInBits); // command num if ((int)ServerPacket.ServerCommand.ConnectOther == (int)res) // new command for server other connections { int bitLen = (int)StaicBitFunctions.CountBits(GetMaxPlayerCount()); packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, bitLen); uint lenRes = StaicBitFunctions.BitArrayToUInt(packetInBits); int playerCountConnected = (int)lenRes; Debug.Log("connected players: " + playerCountConnected); if (playerCountConnected > 0) { int len = (int)StaicBitFunctions.CountBits(maxPlayers); for (int length = 0; length < playerCountConnected; length++) // 0 cant exist as player index { packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, len); res = StaicBitFunctions.BitArrayToUInt(packetInBits); int custId = (int)res; //Debug.Log("id :? " + custId); if (UDPPlayerManager.ContainsIdInConnected(custId.ToString())) { byte[] send_buffer = packetForServer.CommandPacket(ServerPacket.ServerCommand.ConnectedOther); socket.Send(send_buffer); break; } //UDPPManager.ActivatePlayer(custId.ToString()); MainThreadManager.ExecuteOnMainThread(delegate { UDPPlayerManager.ActivatePlayer(custId.ToString()); }); Debug.Log("connection other id:" + custId); } } } if ((int)ServerPacket.ServerCommand.DisconnectedFromOther == (int)res) { int bitLen = (int)StaicBitFunctions.CountBits(GetMaxPlayerCount()); packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, bitLen); res = StaicBitFunctions.BitArrayToUInt(packetInBits); int custId = (int)res; Debug.Log("Disconnected id: " + custId); byte[] send_buffer = packetForServer.CommandPacket(ServerPacket.ServerCommand.DisconnectedFromOther); socket.Send(send_buffer); MainThreadManager.ExecuteOnMainThread(delegate { UDPPlayerManager.DeactivatePlayer(custId.ToString()); }); } if ((int)ServerPacket.ServerCommand.Start == (int)res && !gameStarted) // new command for server other connections { lock (objectLoadSceneLock) { packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 1); packetForServer.AddData(packetInBits[0]); packetForServer.Command(ServerPacket.ServerCommand.Start); gameStarted = packetInBits[0]; } } if ((int)ServerPacket.ServerCommand.Timer == (int)res) // new command for server other connections { packetInBits = StaicBitFunctions.BitsReverseLen(receivedMessageBits, ref currentIndex, 12); res = StaicBitFunctions.BitArrayToUInt(packetInBits); packetForServer.AddData(res); packetForServer.Command(ServerPacket.ServerCommand.Timer); } } } else { //Debug.Log("result in packet len: " + res + " received packet: " + bytesLen); //Debug.Log("received packet len: " + bytesLen); //Debug.LogError("Packet Dropped"); // harmeless error //Packet.PrintValues(receivedMessageBits, 0); } } catch (Exception e) { Debug.Log(e.ToString()); } }