Ejemplo n.º 1
0
        //Event
        private void Base_OnConnected(object sender, SocketAsyncEventArgs e)
        {
            if (e != null)
            {
                if (e.SocketError != SocketError.Success)
                {
                    if (socket != null)
                    {
                        socket.Close();
                        socket = null;
                    }

                    lock (stateLock)
                        state = GClientState.Disconnected;

                    OnFatalError(new SocketException((int)e.SocketError));

                    return;
                }
                e.Dispose();
            }

            lock (stateLock)
                state = GClientState.Connected;

            receiveEventArgs.SetBuffer(header, 0, header.Length);
            receiveEventArgs.Completed += Base_OnHeaderReceived;

            OnConnected();

            try {
                if (!socket.ReceiveAsync(receiveEventArgs))
                {
                    Base_OnHeaderReceived(socket, receiveEventArgs);
                }
            } catch (Exception ex) {
                DisconnectByError(ex);
            }
        }
Ejemplo n.º 2
0
        private bool DisconnectedJob()
        {
            lock (stateLock) {
                if (state != GClientState.Connected)
                {
                    return(false);
                }

                state = GClientState.Disconnecting;
            }

            lock (globalLock) {
                try {
                    socket.Shutdown(SocketShutdown.Both);
                } catch {
                }
                socket.Close();
                socket = null;

                lock (stateLock)
                    state = GClientState.Disconnected;
            }
            return(true);
        }
Ejemplo n.º 3
0
        public bool Connect(IPEndPoint serverEndPoint, bool useAsync = false, int timeout = 3000)
        {
            //Change state
            lock (stateLock) {
                if (state != GClientState.Disconnected)
                {
                    throw new Exception("Socket already connected.");
                }

                state = GClientState.Connecting;
                this.serverEndPoint = serverEndPoint;
            }

            Reset();

            //Socket setting
            Exception socketSettingException = null;

            lock (globalLock) {
                try {
                    socket         = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.NoDelay = socketArgs.noDelay;
                    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(socketArgs.useLinger, socketArgs.lingerTime));

                    byte[] optionBuffer = new byte[12];
                    Array.Copy(BitConverter.GetBytes(socketArgs.useKeepAlive ? 1 : 0), 0, optionBuffer, 0, sizeof(int));
                    Array.Copy(BitConverter.GetBytes(socketArgs.keepAliveTime), 0, optionBuffer, sizeof(int), sizeof(int));
                    Array.Copy(BitConverter.GetBytes(socketArgs.keepAliveInterval), 0, optionBuffer, sizeof(int) * 2, sizeof(int));

                    try {
                        socket.IOControl(IOControlCode.KeepAliveValues, optionBuffer, null);
                    } catch {
                        socketArgs.useKeepAlive = false;
                    }
                } catch (Exception ex) {
                    if (socket != null)
                    {
                        socket.Close();
                        socket = null;
                    }

                    lock (stateLock)
                        state = GClientState.Disconnected;

                    socketSettingException = ex;
                }
            }

            if (socketSettingException != null)
            {
                lock (stateLock) {
                    state = GClientState.Disconnected;
                }

                OnFatalError(socketSettingException);
                return(false);
            }

            //Connect
            SocketAsyncEventArgs connectEventArgs = null;

            try {
                if (useAsync)
                {
                    //Async
                    connectEventArgs                = new SocketAsyncEventArgs();
                    connectEventArgs.Completed     += Base_OnConnected;
                    connectEventArgs.RemoteEndPoint = serverEndPoint;

                    if (!socket.ConnectAsync(connectEventArgs))
                    {
                        //비동기 완료
                        Base_OnConnected(socket, connectEventArgs);
                    }
                    else
                    {
                        CancelAsyncConnect(timeout);
                    }
                }
                else
                {
                    //Blocking
                    IAsyncResult result  = socket.BeginConnect(serverEndPoint, null, null);
                    bool         success = result.AsyncWaitHandle.WaitOne(timeout, true);
                    if (socket.Connected)
                    {
                        Base_OnConnected(socket, null);
                    }
                    else
                    {
                        lock (stateLock) {
                            state = GClientState.Disconnected;
                        }

                        return(false);
                    }
                }
            } catch (Exception ex) {
                lock (stateLock) {
                    state = GClientState.Disconnected;
                }

                OnFatalError(ex);
                return(false);
            }
            return(true);
        }