public bool HandleData(SocketAsyncEventArgs receiveSendEventArgs, P2PPortClientConnectionHandler clientHandler, Int32 remainingBytesToProcess)
        {
            bool incomingTcpMessageIsReady = false;

            if (clientHandler.receivedMessageBytesDoneCount == 0)
            {
                clientHandler.CreateNewDataReceivedBuffer(clientHandler.lengthOfCurrentIncomingMessage);
            }

            if (remainingBytesToProcess + clientHandler.receivedMessageBytesDoneCount == clientHandler.lengthOfCurrentIncomingMessage)
            {
                Buffer.BlockCopy(receiveSendEventArgs.Buffer, clientHandler.receiveMessageOffset, clientHandler.DataReceivedBuffer, clientHandler.receivedMessageBytesDoneCount, remainingBytesToProcess);
                incomingTcpMessageIsReady = true;
            }
            else
            {
                try
                {
                    Buffer.BlockCopy(receiveSendEventArgs.Buffer, clientHandler.receiveMessageOffset, clientHandler.DataReceivedBuffer, clientHandler.receivedMessageBytesDoneCount, remainingBytesToProcess);
                    clientHandler.receiveMessageOffset           = clientHandler.receiveMessageOffset - clientHandler.recPrefixBytesDoneThisOp;
                    clientHandler.receivedMessageBytesDoneCount += remainingBytesToProcess;
                }
                catch (Exception ex)
                {
                    string error = ex.Message;
                }
            }
            return(incomingTcpMessageIsReady);
        }
        private void CreateAndStartPort(object portOwner, int listeningPort)
        {
            if (!(portOwner is IUseP2PCommunicationsScheme))
            {
                throw (new Exception("The port owner object must implement the interface \'IUseP2PCommunicationsScheme\'"));
            }

            this._portOwnerComponent    = portOwner;
            this._ConnectedClientsTable = new Hashtable();
            this._startDateTime         = DateTime.Now;
            this._statisticsHandler     = new P2PPortStatisticsHandler();
            this._listeningPort         = listeningPort;
            string host = System.Net.Dns.GetHostName();

            this._IPAddress          = CommunicationsLibrary.Utilities.CommunicationsUtilities.GetActiveIPAddress();
            this._connectionendpoint = new IPEndPoint(this._IPAddress, this._listeningPort);

            this._prefixHandler  = new PrefixHandler();
            this._messageHandler = new DataReceptionHandler();


            Int32 totalBytes = P2PNetworkingDefinitions.DATABUFFER_SIZE * NUMBER_OF_SAEA_OBJECTS_FOR_REC_AND_SEND * NUMBER_OF_OPERATIONS_TO_ALLOCATE;
            Int32 totalBufferBytesInEachSaeaObject = P2PNetworkingDefinitions.DATABUFFER_SIZE * NUMBER_OF_OPERATIONS_TO_ALLOCATE;

            this._bufferManager = new BufferManager(totalBytes, totalBufferBytesInEachSaeaObject);

            this._poolOfRecSendEventArgs = new SocketAsyncEventArgsPool(NUMBER_OF_SAEA_OBJECTS_FOR_REC_AND_SEND);
            this._poolOfAcceptEventArgs  = new SocketAsyncEventArgsPool(NUMBER_OF_OPERATIONS_TO_ALLOCATE);

            this._maxConnectionsEnforcer = new Semaphore(MAX_CONNECTIONS, MAX_CONNECTIONS);


            //creation of the pool of SEAE Object used to handle incomming connections
            for (Int32 i = 0; i < MAX_SIMULTANEOUS_ACCEPT_OPS; i++)
            {
                SocketAsyncEventArgs SAEA = CreateNewSaeaForAccept(_poolOfAcceptEventArgs);
                this._poolOfAcceptEventArgs.Push(SAEA);
            }

            //creation of the pool of SEAE objects used for send and receive data operations
            SocketAsyncEventArgs eventArgObjectForPool;

            for (Int32 i = 0; i < NUMBER_OF_SAEA_OBJECTS_FOR_REC_AND_SEND; i++)
            {
                eventArgObjectForPool = new SocketAsyncEventArgs();
                this._bufferManager.SetBuffer(eventArgObjectForPool);
                eventArgObjectForPool.Completed += new EventHandler <SocketAsyncEventArgs>(EventHandling_IO_Completed);
                P2PPortClientConnectionHandler _P2PClientCnnHandler = new P2PPortClientConnectionHandler(eventArgObjectForPool, eventArgObjectForPool.Offset, eventArgObjectForPool.Offset + P2PNetworkingDefinitions.DATABUFFER_SIZE, P2PNetworkingDefinitions.DATA_SEND_RECEIVE_PREFIX_LENGHT, P2PNetworkingDefinitions.DATA_SEND_RECEIVE_PREFIX_LENGHT);
                _P2PClientCnnHandler.CreateNewDataReceivedBuffer(P2PNetworkingDefinitions.DATABUFFER_SIZE);
                eventArgObjectForPool.UserToken = _P2PClientCnnHandler;
                this._poolOfRecSendEventArgs.Push(eventArgObjectForPool);
            }

            //creation of the socker and binging to a listening port
            _listenSocket = new Socket(this._connectionendpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            _listenSocket.Bind(this._connectionendpoint);
            _listenSocket.Listen(BACK_LOG);
            StartAccept();
        }
        private void ProcessReceive(SocketAsyncEventArgs receiveSendEventArgs)
        {
            P2PPortClientConnectionHandler clientHandler = (P2PPortClientConnectionHandler)receiveSendEventArgs.UserToken;

            if (receiveSendEventArgs.SocketError != SocketError.Success)
            {
                //---------------------------------------------------------
                // at this point the client has disconnected unexpectedly
                clientHandler.Reset();
                CloseClientSocket(receiveSendEventArgs);
                return;
            }

            if (receiveSendEventArgs.BytesTransferred == 0)
            {
                clientHandler.Reset();
                CloseClientSocket(receiveSendEventArgs);
                return;
            }

            Int32 remainingBytesToProcess = receiveSendEventArgs.BytesTransferred;

            if (clientHandler.receivedPrefixBytesDoneCount < P2PNetworkingDefinitions.DATA_SEND_RECEIVE_PREFIX_LENGHT)
            {
                remainingBytesToProcess = _prefixHandler.HandlePrefix(receiveSendEventArgs, clientHandler, remainingBytesToProcess);

                if (remainingBytesToProcess == 0)
                {
                    StartReceive(receiveSendEventArgs);
                    return;
                }
            }

            bool incomingTcpMessageIsReady;

            incomingTcpMessageIsReady = this._messageHandler.HandleData(receiveSendEventArgs, clientHandler, remainingBytesToProcess);

            if (incomingTcpMessageIsReady != true)
            {
                clientHandler.receiveMessageOffset     = clientHandler.BufferOffsetReceive;
                clientHandler.recPrefixBytesDoneThisOp = 0;
                StartReceive(receiveSendEventArgs);
            }
            else
            {
                //the data transmission is finished
                //the data is treated
                this.ProcessReceivedData(clientHandler);
                clientHandler.CreateNewDataReceivedBuffer(P2PNetworkingDefinitions.DATABUFFER_SIZE);
                clientHandler.Reset();
            }
        }