コード例 #1
0
ファイル: main.cs プロジェクト: StanTsky/ChatServer
 public void HandleConnections()
 {
     Console.WriteLine("Waiting for a connection...");
     while (true)
     {
         _mySocket = AcceptSocket();
         OnSocketAccept?.Invoke(_mySocket); // client connection
     }
     // no return because of multi-threading
 }
コード例 #2
0
        private void _OnCompleted(object sender, SocketAsyncEventArgs args)
        {
            //try
            {
                switch (args.LastOperation)
                {
                case SocketAsyncOperation.Accept:    //accept a connect
                {
                    if (args.SocketError != SocketError.Success)
                    {
                        //直接复用
                        args.AcceptSocket = null;
                        listenSocket.AcceptAsync(args);
                    }
                    if (args.SocketError == SocketError.Success)
                    {
                        var info = new Link(args.AcceptSocket, null);
                        Connects[info.Handle] = info;

                        //直接复用
                        args.AcceptSocket = null;
                        listenSocket.AcceptAsync(args);
                        if (args.SocketError == SocketError.Success)
                        {
                            OnSocketAccept?.Invoke(info.Handle);
                            SetRecivce(info);
                        }
                    }
                }
                    return;

                case SocketAsyncOperation.Connect:    //connect succ
                {
                    if (args.SocketError != SocketError.Success)
                    {
                        OnSocketError?.Invoke(args.UserToken as Socket);
                        args.Dispose();
                    }
                    else
                    {
                        var info = new Link(args.ConnectSocket, args);
                        Connects[info.Handle] = info;

                        OnSocketLinked?.Invoke(info.Handle);

                        SetRecivce(info);
                    }
                    //connect 的这个args不能复用
                }
                    return;

                case SocketAsyncOperation.Send:
                {
                    var hash = (args.UserToken as Link).Handle;
                    if (args.SocketError != SocketError.Success)
                    {
                        ReuseSocketAsyncEventArgs(args);
                        //断链,复用这个接受参数
                        CloseConnect(hash);
                    }
                    else
                    {
                        //发送成功,也复用这个发送参数
                        ReuseSocketAsyncEventArgs(args);
                        //断链,复用这个接受参数
                        OnSocketSend?.Invoke(hash);
                    }
                }
                    return;

                case SocketAsyncOperation.Receive:
                {
                    var hash = (args.UserToken as Link).Handle;
                    if (args.BytesTransferred == 0 || args.SocketError != SocketError.Success)
                    {
                        ReuseRecvSocketAsyncEventArgs(args);        //断链,复用这个接受参数
                        CloseConnect(hash);
                        return;
                    }
                    else
                    {
                        byte[] recv = new byte[args.BytesTransferred];
                        Buffer.BlockCopy(args.Buffer, args.Offset, recv, 0, args.BytesTransferred);
                        (args.UserToken as Link).Socket.ReceiveAsync(args);        //直接复用
                        OnSocketRecv?.Invoke(hash, recv);
                    }
                }
                    return;

                default:
                {
                    break;
                }
                }
            }
        }