コード例 #1
0
    private static void RecieveCallbackUDP(IAsyncResult AR)
    {
        ClientSocket clientSocket = (ClientSocket)AR.AsyncState;

        try
        {
            // Problem part! this is what locks it up when play/stop/play
            byte[] packetData = clientSocket.udpClient.EndReceive(AR, ref clientSocket.udpEndPointRemote);

            // continue recieving packets
            clientSocket.udpClient.BeginReceive(new AsyncCallback(RecieveCallbackUDP), clientSocket);

            FFBasePacket packet;
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                FFSystem.InitBinaryFormatter(bf);
                MemoryStream ms = new MemoryStream((byte[])packetData);
                packet = (FFBasePacket)bf.Deserialize(ms);
                ms.Dispose();
            }
            catch (Exception exp)
            {
                Debug.Log("FFPacket not deserializable (Client UDP)" +
                          "\nException: " + exp.Message +
                          "\nPacket Sise: " + packetData.Length);
                return;
            }

            FFSystem.DisbatchPacket(packet);
            //Debug.Log("Recieve CallbackUDP (Client)"); // debug
        }
        catch (Exception exp)
        {
            Debug.LogError("Error in RecieveCallbackUDP (Client)" +
                           "\nException: " + exp.Message +
                           "\nClient ID: " + clientSocket.clientData.clientId +
                           "\nClient Name: " + clientSocket.clientData.clientName +
                           "\nUDPEndpointLocal: " + clientSocket.udpEndPointLocal +
                           "\nUDPEndPointRemote: " + clientSocket.udpEndPointRemote);
        }
    }
コード例 #2
0
    private static void ProcessRecievedPacket(ClientSocket clientSocket, byte[] packetData)
    {
        MemoryStream    msSendBuffer = new MemoryStream(packetData);
        BinaryFormatter bf           = new BinaryFormatter();

        FFSystem.InitBinaryFormatter(bf);

        FFBasePacket packet;

        try
        {
            packet = (FFBasePacket)bf.Deserialize(msSendBuffer); // if packed cannot
            msSendBuffer.Dispose();
        }
        catch (Exception exp)
        {
            Debug.Log("FFPacket not deserializable (Server)" +
                      "\nException: " + exp.Message +
                      "\nPacket Sise: " + packetData.Length);
            return;
        }

        #region MessageInspectors
        List <BaseMessageInspector> inspectors;
        uint sendToOtherClients = 0; // if any inspectors return a non-zero number, don't distribute to others

        if (singleton._messageInspectors.TryGetValue(packet.messageType, out inspectors))
        {
            foreach (var insp in inspectors)
            {
                try
                {
                    sendToOtherClients |= insp.Inspect(clientSocket, packet);
                }
                catch (Exception exp)
                {
                    Debug.LogError("Error in messageInspector: " + insp.ToString() +
                                   "\nException: " + exp.Message);
                }
            }
        }
        #endregion

        #region RelayMessages
        try
        {
            // if none of the inspectors return a non-zero number the message will be relayed to all other clients
            if (sendToOtherClients == 0)
            {
                // inspectors can modify packects to be send to all other clients, need to re-serialize this
                MemoryStream msBroadcast = new MemoryStream();
                bf.Serialize(msBroadcast, packet);
                byte[] broadcastPacketData = msBroadcast.ToArray();
                msBroadcast.Flush();
                msBroadcast.Dispose();

                // Other Clients
                if (clientSocket.udpClient == null) //TCP
                {
                    // Send out packet to others
                    foreach (var cDataEntry in singleton._clientDataList)
                    {
                        ClientSocket sendToClientSocket = cDataEntry.clientSocketTCP;
                        if (clientSocket.Equals(sendToClientSocket) == false)
                        {
                            sendToClientSocket.socket.BeginSend(broadcastPacketData, 0, broadcastPacketData.Length, SocketFlags.None,
                                                                new AsyncCallback(SendCallbackTCP), sendToClientSocket);
                        }
                    }
                }
                else if (clientSocket.udpClient != null) //UDP
                {
                    ClientData cData;
                    if (singleton._clientData.TryGetValue(packet.senderId, out cData))
                    {
                        // Send out packet to others
                        foreach (var cDataEntry in singleton._clientDataList)
                        {
                            if (cData.clientId != cDataEntry.clientId)
                            {
                                /*Debug.Log("Sending Data to: " + cDataEntry.clientSocketUDP.udpEndPointRemote +
                                 *  "\nClient Id: " + cDataEntry.clientId +
                                 *  "\nPacket.instructions: " + packet.packetInstructions +
                                 *  "\nPacket.entry: " + packet.entry +
                                 *  "\nPacket.messageType: " + packet.messageType +
                                 *  "\nPacket.senderId: " + packet.senderId);*/
                                // debug

                                //Debug.Log("Send UDP packet to " + sendToClientSocket.udpEndPointRemote);
                                cDataEntry.clientSocketUDP.udpClient.Send(broadcastPacketData, broadcastPacketData.Length, cDataEntry.clientSocketUDP.udpEndPointRemote);
                            }

                            /*else // debug
                             * {
                             *  Debug.Log("NOT SENDING TO: " + cDataEntry.clientSocketUDP.udpEndPointRemote +
                             *      "\nClient Id: " + cDataEntry.clientId +
                             *      "\nPacket.instructions: " + packet.packetInstructions +
                             *      "\nPacket.entry: " + packet.entry +
                             *      "\nPacket.messageType: " + packet.messageType +
                             *      "\nPacket.senderId: " + packet.senderId); //debug
                             * }*/
                            //debug
                        }
                    }
                    else
                    {
                        Debug.LogError("Error in ProcessingRecievedPackets" +
                                       "\nCould not find the ClientData connected to the senderId." +
                                       "\nPacket could not be relayed");
                    }
                }
                else // Socket Data is screwed up...
                {
                    Debug.LogError("Error in ProcessingRecievedPackets" +
                                   "\nClientData connected to ClientSocket is messed up...?");
                }

                // Send to Local, because this Unity instance doesn't have a local client to listen through packet.
                // This will be done if we are a dedicated server
                if (singleton._sendToLocal)
                {
                    FFSystem.DisbatchPacket(packet);
                }
            }
        }
        catch (Exception exp)
        {
            Debug.LogError("Exception Error in ProcessingRecievedPackets" +
                           "\nException: " + exp.Message +
                           "\nPacketData.Instructions: " + packet.packetInstructions +
                           "\nPacketData.entry: " + packet.entry +
                           "\nPacketData.MessageType: " + packet.messageType);
        }
        #endregion
    }
コード例 #3
0
    private static void RecieveCallbackTCP(IAsyncResult AR)
    {
        SocketError  socketError  = SocketError.Success;
        ClientSocket clientSocket = (ClientSocket)AR.AsyncState;

        try
        {
            int recieved = clientSocket.socket.EndReceive(AR, out socketError);
            if (recieved != 0 && socketError == SocketError.Success)
            {
                byte[] packetData = new byte[recieved];
                Array.Copy(clientSocket.recieveDataBuffer, packetData, recieved);

                // continue recieving packets
                clientSocket.socket.BeginReceive(clientSocket.recieveDataBuffer, 0, clientSocket.recieveDataBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallbackTCP), clientSocket);

                FFBasePacket packet;
                try
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    FFSystem.InitBinaryFormatter(bf);
                    MemoryStream ms = new MemoryStream(packetData);
                    packet = (FFBasePacket)bf.Deserialize(ms);
                    ms.Dispose();
                }
                catch (Exception exp)
                {
                    Debug.Log("FFPacket not deserializable (Client TCP)" +
                              "\nException: " + exp.Message +
                              "\nPacket Sise: " + packetData.Length);
                    return;
                }

                FFSystem.DisbatchPacket(packet);
                //Debug.Log("Recieve CallbackTCP (Client)"); //debug
            }
            else
            {
                if (socketError != SocketError.Success)
                {
                    Debug.LogError("RecieveCallbackTCP SocketShutdown (Client)" +
                                   "\nSocketError: " + socketError +
                                   "\nClient ID: " + clientSocket.clientData.clientId +
                                   "\nClient Name: " + clientSocket.clientData.clientName);
                }
                else
                {
                    Debug.Log("RecieveCallbackTCP SocketShutdown (Client)" +
                              "\nClient ID: " + clientSocket.clientData.clientId +
                              "\nClient Name: " + clientSocket.clientData.clientName);
                }
            }
        }
        catch (Exception exp)
        {
            if (socketError != SocketError.Success)
            {
                Debug.LogError("Error in RecieveCallbackTCP (Client)" +
                               "\nException: " + exp.Message +
                               "\nSocketError: " + socketError +
                               "\nClient ID: " + clientSocket.clientData.clientId +
                               "\nClient Name: " + clientSocket.clientData.clientName);
            }
            else
            {
                Debug.LogError("Error in RecieveCallbackTCP (Client)" +
                               "\nException: " + exp.Message +
                               "\nClient ID: " + clientSocket.clientData.clientId +
                               "\nClient Name: " + clientSocket.clientData.clientName);
            }
        }
    }