private void HandleOnDataFrameRecvd(RecvdDataFrameEventArgs e)
 {
     Debug.Log("handling");
     if (e.Status == DataFrameStatus.Normal)
     {
         packet = e.Data;
         saved.DeckDeserializer(packet.Frame);
         hasRecvdData = true;
     }
 }
Beispiel #2
0
    private void OnRecv(IAsyncResult ar)
    {
        SocketState socketState = ar.AsyncState as SocketState;

        try {
            int bytesRead = socketState.ReaderSocket.EndReceive(ar); // read bytes from stream
            socketState.TotalBytesRead += bytesRead;                 // keep track of how many bytes we've read from the stream for the current dataframe

            if (socketState.ExpectedFrameSize == -1)                 // get the data frame size
            {
                if (bytesRead <= 0)
                {
                    Debug.Log("Zero bytes recvd");                                     // TODO: handle ...with exception?
                }
                if (socketState.TotalBytesRead == 4)                                   // we filled the 4-byte dataframe size buffer
                {
                    int nbo = BitConverter.ToInt32(socketState.FrameSize, 0);          // read the 4-byte buffer
                    socketState.ExpectedFrameSize = IPAddress.NetworkToHostOrder(nbo); // convert the read from network byte order to little e

                    if (socketState.ExpectedFrameSize < 0)
                    {
                        Debug.Log("Invalid Framesize");    // TODO: handle ...
                    }
                    socketState.DataFrame        = new DataFramePacket(socketState.ExpectedFrameSize);
                    socketState.IsFrameSizeKnown = true;
                    socketState.TotalBytesRead   = 0; // reset num bytes read cus we dont want the framesize byte count included
                }

                if (socketState.ExpectedFrameSize != 0)   // if expectedframesize not 0 || -1, check why
                {
                    if (socketState.IsFrameSizeKnown)     // if framesize known, switch to using the dataframe buffer
                    {
                        serverSocket.BeginReceive(socketState.DataFrame.Frame, 0,
                                                  socketState.DataFrame.Frame.Length,
                                                  SocketFlags.None, new AsyncCallback(OnRecv),
                                                  socketState);
                    }
                    else     // wait for more bytes to get the framesize
                    {
                        serverSocket.BeginReceive(socketState.FrameSize,
                                                  socketState.TotalBytesRead,                                // offset
                                                  socketState.FrameSize.Length - socketState.TotalBytesRead, // remaining bytes needed to get a complete framesize
                                                  SocketFlags.None, new AsyncCallback(OnRecv),
                                                  socketState);
                    }
                }
                else     // a 0 means keep alive
                {
                    RecvdDataFrameEventArgs args = new RecvdDataFrameEventArgs(null, DataFrameStatus.KeepAlive);
                    RaiseDataFrameRecvd(args);    // notify listeners of keep alive packet

                    socketState.InitState( );
                }
            }
            else
            {
                if (socketState.TotalBytesRead == socketState.ExpectedFrameSize)     // we've got the entire msg
                {
                    RecvdDataFrameEventArgs args = new RecvdDataFrameEventArgs(socketState.DataFrame, DataFrameStatus.Normal);
                    RaiseDataFrameRecvd(args);                          // notify listeners of the incoming daraframe

                    socketState.InitState( );                           // reset socket state
                    socketState.ReaderSocket = serverSocket;
                    serverSocket.BeginReceive(socketState.FrameSize, 0, // reenter the listen loop
                                              socketState.FrameSize.Length, SocketFlags.None,
                                              new AsyncCallback(OnRecv), socketState);
                }
                else
                {
                    if (bytesRead <= 0)
                    {
                        Debug.Log("Zero bytes recvd");    // TODO: handle ...with exception?
                    }
                    serverSocket.BeginReceive(socketState.DataFrame.Frame,
                                              socketState.TotalBytesRead,                                      // offset
                                              socketState.DataFrame.Frame.Length - socketState.TotalBytesRead, // remaining buffer
                                              SocketFlags.None, new AsyncCallback(OnRecv),
                                              socketState);
                }
            }
        } catch (ObjectDisposedException ode) {
            Debug.Log(ode);
        } catch (Exception e) {
            Debug.Log(e);
        }
    }