/// <summary> /// This the call back function which will be invoked when the socket /// detects any client writing of data on the stream /// </summary> /// <param name="asyn"></param> public void OnDataReceived(IAsyncResult asyn) { SocketPacket socketData = (SocketPacket)asyn.AsyncState; if (!receiving_data.Contains(socketData.m_clientNumber)) { receiving_data.Add(socketData.m_clientNumber); try { // Complete the BeginReceive() asynchronous call by EndReceive() method // which will return the number of characters written to the stream // by the client int iRx = socketData.m_currentSocket.EndReceive(asyn); char[] chars = new char[iRx + 1]; // Extract the characters as a buffer System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); if (chars.Length > 1) { string szData = ""; for (int ch = 0; ch < chars.Length; ch++) { if (chars[ch] != 0) { szData += chars[ch]; } } // add the data to the receive buffer if (receive_buffer == null) { receive_buffer = new ArrayList(); // create a thread which will process incoming receipts // in an organised fashion ThreadServerReceive receive = new ThreadServerReceive(new WaitCallback(OnDataReceivedCallback), this, receive_buffer); Thread receive_thread = new Thread(new ThreadStart(receive.Execute)); receive_thread.Priority = ThreadPriority.Normal; receive_thread.Start(); } // push data into the receive buffer } receive_buffer.Add(szData); receive_buffer.Add(socketData.m_clientNumber); } // Continue the waiting for data on the Socket if (!disconnect_now.Contains(socketData.m_clientNumber)) { WaitForData(socketData.m_currentSocket, socketData.m_clientNumber); } else { disconnect_now.Remove(socketData.m_clientNumber); } } catch (ObjectDisposedException) { System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); } catch (SocketException se) { if (se.ErrorCode == 10054) // Error code for Connection reset by peer { string msg = "Goodbye client " + socketData.m_clientNumber.ToString(); Console.WriteLine(msg); // Remove the reference to the worker socket of the closed client // so that this object will get garbage collected int index = socketData.m_clientNumber - 1; if ((index > -1) && (index < m_workerSocketList.Count)) { m_workerSocketList[index] = null; } } else { Console.WriteLine("dpslamServer/OnDataReceived(" + PortNumber.ToString() + ")/" + se.Message); } } receiving_data.Remove(socketData.m_clientNumber); } else { Console.WriteLine("Receive conflict: Data already being received from client " + socketData.m_clientNumber.ToString()); disconnect_client.Add(socketData.m_clientNumber); } }
/// <summary> /// This the call back function which will be invoked when the socket /// detects any client writing of data on the stream /// </summary> /// <param name="asyn"></param> public void OnDataReceived(IAsyncResult asyn) { SocketPacket socketData = (SocketPacket)asyn.AsyncState ; if (!receiving_data.Contains(socketData.m_clientNumber)) { receiving_data.Add(socketData.m_clientNumber); try { // Complete the BeginReceive() asynchronous call by EndReceive() method // which will return the number of characters written to the stream // by the client int iRx = socketData.m_currentSocket.EndReceive (asyn); char[] chars = new char[iRx + 1]; // Extract the characters as a buffer System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0); if (chars.Length > 1) { string szData = ""; for (int ch = 0; ch < chars.Length; ch++) { if (chars[ch] != 0) szData += chars[ch]; } // add the data to the receive buffer if (receive_buffer == null) { receive_buffer = new ArrayList(); // create a thread which will process incoming receipts // in an organised fashion ThreadServerReceive receive = new ThreadServerReceive(new WaitCallback(OnDataReceivedCallback), this, receive_buffer); Thread receive_thread = new Thread(new ThreadStart(receive.Execute)); receive_thread.Priority = ThreadPriority.Normal; receive_thread.Start(); } // push data into the receive buffer } receive_buffer.Add(szData); receive_buffer.Add(socketData.m_clientNumber); } // Continue the waiting for data on the Socket if (!disconnect_now.Contains(socketData.m_clientNumber)) { WaitForData(socketData.m_currentSocket, socketData.m_clientNumber ); } else { disconnect_now.Remove(socketData.m_clientNumber); } } catch (ObjectDisposedException ) { System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n"); } catch(SocketException se) { if(se.ErrorCode == 10054) // Error code for Connection reset by peer { string msg = "Goodbye client " + socketData.m_clientNumber.ToString(); Console.WriteLine(msg); // Remove the reference to the worker socket of the closed client // so that this object will get garbage collected int index = socketData.m_clientNumber - 1; if ((index > -1) && (index < m_workerSocketList.Count)) m_workerSocketList[index] = null; } else { Console.WriteLine("dpslamServer/OnDataReceived(" + PortNumber.ToString() + ")/" + se.Message); } } receiving_data.Remove(socketData.m_clientNumber); } else { Console.WriteLine("Receive conflict: Data already being received from client " + socketData.m_clientNumber.ToString()); disconnect_client.Add(socketData.m_clientNumber); } }