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); } }