コード例 #1
0
 static void RunCallback(IAnswerCallback callback, int errorCode)
 {
     ClientEngine.RunTask(() => {
         callback.OnException(null, errorCode);
     });
 }
コード例 #2
0
        private void SendCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success && !beginClosing)
            {
                CloseByException("Send data to " + endpoint + " failed. Due to SocketError: " + e.SocketError, null, false);
                return;
            }

            currSendOffset += e.BytesTransferred;
            if (currSendOffset == currSendBuffer.Length)
            {
                currSendOffset = 0;

                lock (interLocker)
                {
                    if (sendQueue.Count > 0)
                    {
                        currSendBuffer = sendQueue.Dequeue();
                    }
                    else
                    {
                        currSendBuffer = null;
                        return;
                    }
                }
            }

            if (beginClosing)
            {
                return;
            }

            sendAsyncEventArgs.SetBuffer(currSendBuffer, currSendOffset, currSendBuffer.Length - currSendOffset);

            try
            {
                if (!socket.SendAsync(sendAsyncEventArgs))
                {
                    recursionDeepOfSendFunction += 1;
                    if (recursionDeepOfSendFunction <= MaxRecursionDeepOfSendFunction)
                    {
                        SendCompleted(socket, sendAsyncEventArgs);
                    }
                    else
                    {
                        recursionDeepOfSendFunction = 0;
                        ClientEngine.RunTask(() => {
                            SendCompleted(socket, sendAsyncEventArgs);
                        });
                    }
                }
            }
            catch (ObjectDisposedException ex)
            {
                CloseByException("Send data to " + endpoint + " exception. Connection is broken.", ex, true);
            }
            catch (SocketException ex)
            {
                CloseByException("Send data to " + endpoint + " exception. Access socket is error.", ex, false);
            }
            catch (InvalidOperationException)
            {
                //-- DO nothings
            }
        }
コード例 #3
0
        private void ConnectCompleted(object sender, SocketAsyncEventArgs e)
        {
            int unityDisCompliantSign = System.Threading.Interlocked.Exchange(ref connectCompletedSignForUnityIl2CPPDisCompliantImplement, 1);

            if (unityDisCompliantSign != 0)
            {
                if (e.SocketError != SocketError.Success)
                {
                    lock (interLocker)
                    {
                        if (status == TCPClient.ClientStatus.Connecting)
                        {
                            requireClose = true;
                            return;
                        }
                        else if (status == TCPClient.ClientStatus.Closed)
                        {
                            return;
                        }
                    }

                    //-- status == TCPClient.ClientStatus.Connected
                    Close();
                }

                return;
            }

            if (e.SocketError != SocketError.Success)
            {
                if (errorRecorder != null && !requireClose)
                {
                    errorRecorder.RecordError("Connect to " + endpoint + " failed. Due to SocketError: " + e.SocketError);
                }

                CloseWhenConnectingError();
                return;
            }

            if (requireClose)
            {
                CallConnectionConnectedDelegate(0, false, "Connecting cannel event exception. Remote endpoint: " + endpoint + ".");
                connectionCloseDelegate = null;
                Close();
                return;
            }

            receiveAsyncEventArgs.SetBuffer(receiver.buffer, receiver.offset, receiver.requireLength - receiver.offset);
            connectionId = socket.Handle.ToInt64();

            CallConnectionConnectedDelegate(connectionId, true, "Connected event exception. Remote endpoint: " + endpoint + ".");

            lock (interLocker)
            {
                status = TCPClient.ClientStatus.Connected;
            }

            if (requireClose)
            {
                Close();
                return;
            }

            if (ClientEngine.RegisterConnectedConnection(this) == false)
            {
                Close();
                return;
            }

            CheckSending();

            try
            {
                if (!socket.ReceiveAsync(receiveAsyncEventArgs))
                {
                    ReceiveCompleted(socket, receiveAsyncEventArgs);
                }
            }
            catch (ObjectDisposedException ex)
            {
                CloseByException("Receive data from " + endpoint + " exception. Connection is broken.", ex, true);
            }
            catch (SocketException ex)
            {
                CloseByException("Receive data from " + endpoint + " exception. Access socket is error.", ex, false);
            }
            catch (InvalidOperationException)
            {
                //-- Do nothings
            }
        }
コード例 #4
0
        private void ReceiveCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success && !beginClosing)
            {
                CloseByException("Receive data from " + endpoint + " failed. Due to SocketError: " + e.SocketError, null, false);
                return;
            }

            if (e.BytesTransferred == 0)
            {
                Close();
                return;
            }

            receiver.offset += e.BytesTransferred;
            if (receiver.offset == receiver.requireLength)
            {
                Quest  quest;
                Answer answer;

                try
                {
                    receiver.Done(out quest, out answer);
                }
                catch (ReceiverErrorMessageException ex)
                {
                    CloseByException("Processing received data from " + endpoint + " error: " + ex.Message + ". Connection will be closed.", null, false);
                    return;
                }
                catch (Exception ex)
                {
                    CloseByException("Processing received data from " + endpoint + " exception. Connection will be closed.", ex, false);
                    return;
                }


                if (answer != null)
                {
                    DealAnswer(answer);
                }
                else if (quest != null)
                {
                    DealQuest(quest);
                }
            }

            if (beginClosing)
            {
                return;
            }

            receiveAsyncEventArgs.SetBuffer(receiver.buffer, receiver.offset, receiver.requireLength - receiver.offset);

            try
            {
                if (!socket.ReceiveAsync(receiveAsyncEventArgs))
                {
                    recursionDeepOfReceiveFunction += 1;
                    if (recursionDeepOfReceiveFunction <= MaxRecursionDeepOfReceiveFunction)
                    {
                        ReceiveCompleted(socket, receiveAsyncEventArgs);
                    }
                    else
                    {
                        recursionDeepOfReceiveFunction = 0;
                        ClientEngine.RunTask(() => {
                            ReceiveCompleted(socket, receiveAsyncEventArgs);
                        });
                    }
                }
            }
            catch (ObjectDisposedException ex)
            {
                CloseByException("Receive data from " + endpoint + " exception. Connection is broken.", ex, true);
            }
            catch (SocketException ex)
            {
                CloseByException("Receive data from " + endpoint + " exception. Access socket is error.", ex, false);
            }
            catch (InvalidOperationException)
            {
                //-- Do nothings
            }
        }
コード例 #5
0
        //----------------[ I/O Operations ]-----------------------//

        public void AsyncConnect(int connectTimeout)
        {
            lock (interLocker)
            {
                if (status != TCPClient.ClientStatus.Closed)
                {
                    return;
                }

                status = TCPClient.ClientStatus.Connecting;
            }

            if (ClientEngine.RegisterConnectingConnection(this, connectTimeout) == false)
            {
                lock (interLocker)
                {
                    status       = TCPClient.ClientStatus.Closed;
                    beginClosing = true;
                }

                CallConnectionConnectedDelegate(0, false, "Connecting cannel event exception. Remote endpoint: " + endpoint + ".");
                connectionCloseDelegate = null;
                socket.Close();
                return;
            }

            connectionId       = 0;
            receiver           = new StandardReceiver();
            sendAsyncEventArgs = new SocketAsyncEventArgs {
                RemoteEndPoint = endpoint
            };
            sendAsyncEventArgs.Completed += IO_Completed;

            recursionDeepOfReceiveFunction = 0;
            recursionDeepOfSendFunction    = 0;

            try
            {
                if (!socket.ConnectAsync(receiveAsyncEventArgs))      //-- Synchronous
                {
                    ConnectCompleted(socket, receiveAsyncEventArgs);
                }
                else
                {
                    lock (interLocker)
                    {
                        if (requireClose)
                        {
                            CannelConnecting();
                        }
                        else
                        {
                            connectingCanBeCannelled = true;
                        }
                    }
                }
            }
            catch (SocketException e)
            {
                if (errorRecorder != null)
                {
                    errorRecorder.RecordError("Connect to " + endpoint + " failed.", e);
                }

                CloseWhenConnectingError();
            }
            catch (ObjectDisposedException e)
            {
                if (errorRecorder != null)
                {
                    errorRecorder.RecordError("Connect to " + endpoint + " failed.", e);
                }

                CloseWhenConnectingError();
            }
        }