private void OnReceivedClientData(IAsyncResult async) { TetriNETTCPCallback stateObject = (TetriNETTCPCallback)async.AsyncState; try { //DataContractSerializer serializer = new DataContractSerializer(); // Complete async receive method and read data length int bytesRead = stateObject.Socket.EndReceive(async); if (stateObject.Socket.Connected) { if (bytesRead > 0) { stateObject.Message.Append(Encoding.ASCII.GetString(stateObject.Buffer, 0, bytesRead)); // TODO: non ascii if (true /*TODO: parse string/buffer and check <EOF>*/) { // All data has been received // TODO: deserialize and call IHost method Console.WriteLine("OnReceivedClientData:[{0}]", stateObject.Message); stateObject.Message.Clear(); } stateObject.Socket.BeginReceive(stateObject.Buffer, 0, TetriNETTCPCallback.BufferSize, 0, OnReceivedClientData, stateObject); } else { OnClientDisconnected(stateObject.Socket); } } else { OnClientDisconnected(stateObject.Socket); } } catch (SocketException ex) { Log.Default.WriteLine(LogLevels.Error, "OnReceivedClientData: SocketException: {0}", ex); OnClientDisconnected(stateObject.Socket); } catch (Exception ex) { Log.Default.WriteLine(LogLevels.Error, "OnReceivedClientData: Exception: {0}", ex); OnClientDisconnected(stateObject.Socket); } }
private void OnClientConnected(IAsyncResult async) { // Get client socket Socket socket = _serverSocket.EndAccept(async); // Create state/callback object TetriNETTCPCallback stateObject = new TetriNETTCPCallback { Socket = socket, }; // Add state object to active connections _connections.Add(socket, stateObject); // Release server socket to keep listening if limit is not reached _serverSocket.BeginAccept(OnClientConnected, null); // Allow connected client to receive data and designate a callback method socket.BeginReceive(stateObject.Buffer, 0, TetriNETTCPCallback.BufferSize, 0, OnReceivedClientData, stateObject); }