Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用套接字获取对象已处置异常_C#_Sockets_Object_Exception - Fatal编程技术网

C# 使用套接字获取对象已处置异常

C# 使用套接字获取对象已处置异常,c#,sockets,object,exception,C#,Sockets,Object,Exception,首先。我为大量的代码片段道歉。但是我在这个阶段是没有希望的,我需要一些答案来说明我做错了什么 我启动服务器,然后客户端连接到服务器并单击“登录”以验证其密码。但问题是。第一次发送请求时,一切正常,但第二次直接在第一次尝试后,再次按下登录按钮。我明白了 引发异常:System.dll中的“System.ObjectDisposedException” 我似乎不知道我的问题在哪里 我还需要帮助,我必须断开用户和所有家务事的连接 守则: private byte[] _buffer = new

首先。我为大量的代码片段道歉。但是我在这个阶段是没有希望的,我需要一些答案来说明我做错了什么

我启动服务器,然后客户端连接到服务器并单击“登录”以验证其密码。但问题是。第一次发送请求时,一切正常,但第二次直接在第一次尝试后,再次按下登录按钮。我明白了

引发异常:System.dll中的“System.ObjectDisposedException”

我似乎不知道我的问题在哪里

我还需要帮助,我必须断开用户和所有家务事的连接

守则:

    private byte[] _buffer = new byte[16 * 1024];
    static List<Socket> _connectedClients = new List<Socket>();
    private Socket _serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    private IPEndPoint ipport = null;
    private int port = 0;


    private void SetupServer()
    {
        lstConnections.Items.Add("--==(  Setting Up Server  )==--");
        _serverSocket.Bind(ipport);
        _serverSocket.Listen(38);
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }

    private void AcceptCallback(IAsyncResult AR)
    {
        Socket socket;
        try
        {
            //socket = (Socket)AR.AsyncState;
            socket = _serverSocket.EndAccept(AR);
        }
        catch (ObjectDisposedException)
        {

            return;
        }

        _connectedClients.Add(socket);
        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket);
        Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Client Connected, Waiting for request..."); });
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }

    private void RecieveCallback(IAsyncResult AR)
    {
        try
        {
            Socket socket = (Socket)AR.AsyncState;
            int recieved = 0;
            try
            {
                recieved = socket.EndReceive(AR);

            }
            catch (Exception exc)
            {
                FileHandlerTxt FHandler = new FileHandlerTxt();
                FHandler.appendDataToTextFile(new List<string> { string.Format("Client forcefully disconnected at {0}. Error : {1}", DateTime.UtcNow.ToLongDateString(), exc.Message) });
                socket.Close();
                _connectedClients.Remove(socket);
                return;
            }

            byte[] dataBuffer = new byte[recieved];
            Array.Copy(_buffer, dataBuffer, recieved);

            object unkown = dataBuffer.Deserialize();

            if (unkown is Login)
            {
                Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Got login request..."); });
                #region Login
                Login login = (Login)unkown;

                            //Do stuff in the call Class
                            // .Serialize() is an extension method

                            byte[] data = call.Serialize();
                            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
                            socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket);
                            Invoke((MethodInvoker)delegate { lstConnections.Items.Add(login.Username + " Signed in"); });
                        }
                        else
                        {
                            MessageClass call = new MessageClass("Failed. Password incorrect");
                            call.ckey = 2;
                            login.updateFailedAttempts(LoginAttempts + 1);
                            byte[] data = call.Serialize();
                            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
                            socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket);
                        }
                    }
                    else
                    {
                        MessageClass call = new MessageClass("Failed. To many failed attempts");
                        call.ckey = 4;
                        RootObject LocData = LocationData.getLocationData();
                        string message = string.Format("You have entered your password wrong 3 times on {0} at {1} from {2}:{3}. Your account has been locked. Please go to the lodge to unlock your account.", DateTime.UtcNow.ToLongDateString(), DateTime.UtcNow.ToLongTimeString(), IPLocation.getIPAddress(), LocData.country);
                        message.SendEmail();
                        byte[] data = call.Serialize();
                        socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
                        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket);
                    }

                }
                else
                {
                    MessageClass call = new MessageClass("Failed. User does not exists");
                    call.ckey = 3;
                    byte[] data = call.Serialize();
                    socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
                    socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallback), socket);
                }
                #endregion
            }
            else if (unkown is Client)
            {
                #region Client
                Client newClient = (Client)unkown;
                newClient.Queries(newClient.ckey);
                Invoke((MethodInvoker)delegate
                {
                    lstConnections.Items.Add("Did requested Client query");
                });

                #endregion
            }
            else if (unkown is MessageClass)
            {
                Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Got Disconnect request..."); });
                MessageClass call = (MessageClass)unkown;
                if (call.ckey == -10)
                {
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Close();
                    socket.Dispose();
                    _connectedClients.Remove(socket);
                    Invoke((MethodInvoker)delegate { lstConnections.Items.Add("Client Disconnected..."); });
                    return;
                }
            }


        }
        catch (Exception exc)
        {
            FileHandlerTxt FHandler = new FileHandlerTxt();
            FHandler.appendDataToTextFile(new List<string> { string.Format("RecieveCallback problem at {0}. Error : {1}", DateTime.UtcNow.ToLongDateString(), exc.Message) });
        }


    }



    private void SendCallback(IAsyncResult AR)
    {
        Socket socket = (Socket)AR.AsyncState;
        socket.EndSend(AR);
    }
private byte[]_buffer=新字节[16*1024];
静态列表_connectedClients=新列表();
私有套接字_serverSocket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
私有IPEndPoint ipport=null;
专用int端口=0;
私有void SetupServer()
{
lstConnections.Items.Add(“--=(设置服务器)==”);
_serverSocket.Bind(ipport);
_serverSocket.Listen(38);
_serverSocket.BeginAccept(新的AsyncCallback(AcceptCallback),null);
}
私有void AcceptCallback(IAsyncResult AR)
{
插座;
尝试
{
//socket=(socket)AR.AsyncState;
套接字=_serverSocket.EndAccept(AR);
}
捕获(ObjectDisposedException)
{
返回;
}
_connectedClients.Add(套接字);
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),socket);
Invoke((MethodInvoker)委托{lstConnections.Items.Add(“客户端已连接,等待请求…”);});
_serverSocket.BeginAccept(新的AsyncCallback(AcceptCallback),null);
}
私有无效接收回调(IAsyncResult AR)
{
尝试
{
套接字套接字=(套接字)AR.AsyncState;
接收的int=0;
尝试
{
Received=插座端接收(AR);
}
捕获(异常exc)
{
FileHandlerTxt FHandler=新的FileHandlerTxt();
FHandler.appendDataToTextFile(新列表{string.Format(“客户端在{0}处强制断开连接。错误:{1}”,DateTime.UtcNow.ToLongDateString(),exc.Message)});
socket.Close();
_已连接的客户端。卸下(套接字);
返回;
}
字节[]数据缓冲=新字节[接收];
数组.Copy(_buffer,dataBuffer,received);
object unknown=dataBuffer.Deserialize();
如果(未知是登录)
{
Invoke((MethodInvoker)委托{lstConnections.Items.Add(“获取登录请求…”);});
#区域登录
登录名=(登录名)未知;
//在呼叫课上做一些事情
//.Serialize()是一个扩展方法
byte[]data=call.Serialize();
socket.BeginSend(数据,0,数据.Length,SocketFlags.None,新异步回调(SendCallback),socket);
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),socket);
Invoke((MethodInvoker)委托{lstConnections.Items.Add(login.Username+“Signed in”);});
}
其他的
{
MessageClass调用=新建MessageClass(“失败。密码不正确”);
call.ckey=2;
login.updatefailedattests(loginattests+1);
byte[]data=call.Serialize();
socket.BeginSend(数据,0,数据.Length,SocketFlags.None,新异步回调(SendCallback),socket);
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),socket);
}
}
其他的
{
MessageClass call=newmessageclass(“失败的尝试次数”);
call.ckey=4;
RootObject LocData=LocationData.getLocationData();
string message=string.Format(“您从{2}:{3}在{1}的{0}上输入了错误的密码3次。您的帐户已被锁定。请前往小屋解锁您的帐户。”,DateTime.UtcNow.ToLongDateString(),DateTime.UtcNow.ToLongTimeString(),IPLocation.getIPAddress(),LocData.country);
message.sendmail();
byte[]data=call.Serialize();
socket.BeginSend(数据,0,数据.Length,SocketFlags.None,新异步回调(SendCallback),socket);
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),socket);
}
}
其他的
{
MessageClass调用=新建MessageClass(“失败。用户不存在”);
call.ckey=3;
byte[]data=call.Serialize();
socket.BeginSend(数据,0,数据.Length,SocketFlags.None,新异步回调(SendCallback),socket);
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),socket);
}
#端区
}
否则如果(未知为客户)
{
#区域客户端
客户机newClient=(客户机)未知;
newClient.querys(newClient.ckey);
调用((MethodInvoker)委托
{
lstConnections.Items.Ad
private void btnSignIn_Click(object sender, RoutedEventArgs e)
    {



        //Enable wat onder is vir Authentication

        try
        {

            Login login = new Login(txtUsername.Text,passboxPassword.SecurePassword.EncryptPassword(txtUsername.Text),IPLocation.getIPAddress(),0);
            _clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.14"),8081));
            _clientSocket.Send(login.Serialize());
            RecieveResponse();
        }
        catch (SocketException se)
        {
            FileHandlerTxt FHandler = new FileHandlerTxt();
            FHandler.appendDataToTextFile(new List<string> { string.Format("Socket Exception {0} on {1}", se.Message, DateTime.UtcNow.ToLongDateString()) });
        }
        catch (Exception exc)
        {
            FileHandlerTxt FHandler = new FileHandlerTxt();
            FHandler.appendDataToTextFile(new List<string> { string.Format("Exception {0} on {1}", exc.Message, DateTime.UtcNow.ToLongDateString()) });
        }



    }


    private void RecieveResponse()
    {
        byte[] buffer = new byte[2048];
        int recieved = _clientSocket.Receive(buffer, SocketFlags.None);
        if (recieved == 0) return;
        byte[] data = new byte[recieved];
        Array.Copy(buffer,data,recieved);
        object unkown = data.Deserialize();
        MessageClass returnMessage = (MessageClass)unkown;
        if (returnMessage.ckey == 1)
        {
            string AskingPasscode = "";
            RecievePasscode passauth = new RecievePasscode();
            if (passauth.ShowDialog() == false)
            {
                AskingPasscode = passauth.PassCode;
            }
            if (AskingPasscode == returnMessage.PassKey.DecryptPasscode(txtUsername.Text))
            {
                if (returnMessage.AuthLevel == 2)
                {
                    SESSION.AccountType = "Admin";
                    SESSION.AuthLevel = 2;
                    SESSION.ID = returnMessage.client.ID;
                    SESSION.Name = returnMessage.client.Name;
                    MainWindow main = new MainWindow();
                    main.Show();
                    this.Close();
                }
                else if (returnMessage.AuthLevel == 1)
                {
                    SESSION.AccountType = "Hunter";
                    SESSION.AuthLevel = 1;
                    SESSION.ID = returnMessage.client.ID;
                    SESSION.Name = returnMessage.client.Name;
                    MainWindow main = new MainWindow();
                    main.Show();
                    this.Close();
                }
                else
                {
                    SESSION.AccountType = "User";
                    SESSION.AuthLevel = 0;
                    SESSION.ID = returnMessage.client.ID;
                    SESSION.Name = returnMessage.client.Name;
                    MainWindow main = new MainWindow();
                    main.Show();
                    this.Close();
                }
            }
        }
        else
        {
            MessageBox.Show(returnMessage.Message);
        }

        MessageClass call = new MessageClass("Exit");
        call.ckey = -10;
        _clientSocket.Send(call.Serialize());
        _clientSocket.Shutdown(SocketShutdown.Both);
        _clientSocket.Close();
        _clientSocket.Dispose();
        MessageBox.Show("Client Disconnect.");


    }