示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
			}
		}