在.NET Core 3.1中关闭C#套接字的正确方法是什么?

阿玛

问题

我正在尝试处理我的应用程序的断开连接,并且到目前为止我尝试过的任何方法都失败了,我试图与服务器端断开连接,我试图与客户端断开连接,但是在两端都收到问题,我想要在此处实现的目标是通过QUIT命令断开应用程序的连接,而不必从关闭图标将其关闭,因为它会引发异常

client.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MessengerConsole
{
class Client
{
    static string username;
    static int port = 8888;
    static IPAddress clientIP;
    static Socket serverSocket;
    static Thread processThread;
    static bool connected = false;

    static string GetIp()
    {
        Console.WriteLine("Type the server ip:");
        String clientIP = Console.ReadLine();
        Console.WriteLine("Client IP: " + clientIP);
        //return clientIP;
        //temp solution
        return "192.168.0.106";
    }

    static void printSession()
    {
        Console.Clear();
        Console.WriteLine("//=====================================================");
        Console.WriteLine("//                       Session Details               ");
        Console.WriteLine("//                    =====================");
        Console.WriteLine("//                    IP: " + clientIP + "\n//                    Time: " + DateTime.Now);
        Console.WriteLine("//=====================================================");
    }
    static void clientReceiver()
    {
        while (true)
        {
            Thread.Sleep(500);
            byte[] buffer = new byte[300];
            int rece = serverSocket.Receive(buffer, 0, buffer.Length, 0);
            Array.Resize(ref buffer, rece);
            if (connected == false)
            {
                Console.WriteLine("[" + DateTime.Now.ToString() + "] " + Encoding.Default.GetString(buffer) + " Connected!");
                connected = true;
            }

            else
            {

                if (Encoding.Default.GetString(buffer) == "QUIT")
                {
                    //Quit
                    Console.WriteLine("Server Shutdown");
                    serverSocket.Shutdown(SocketShutdown.Both);
                    serverSocket.Close();
                   
                }
                else
                {
                    Console.WriteLine("[" + DateTime.Now.ToString() + "] " + Encoding.Default.GetString(buffer));
                }

            }
        }
    }



    public static void StartClient()
    {
        processThread = new Thread(clientReceiver);
        Console.WriteLine("Please enter your name");
        username = Console.ReadLine();
        clientIP = IPAddress.Parse(GetIp());  //Returns IP from GetIP()
        Console.WriteLine("Please enter HostPort");
        //string portString = Console.ReadLine();
        //temp port
        string portString = "80";
        try
        {
            port = Convert.ToInt32(portString);
        }
        catch
        {
            port = 8888;
        }
        try
        {

            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Connect(new IPEndPoint(clientIP, port));
            processThread.Start();
            byte[] name = Encoding.Default.GetBytes(username);
            
            //Send Name
            serverSocket.Send(name);
           // byte[] data = Encoding.Default.GetBytes("<" + username + "> Connected");
            //serverSocket.Send(data, 0, data.Length, 0);
            printSession();
            while (serverSocket.Connected)
            {
                //byte[] sdata = Encoding.Default.GetBytes("<" + username + ">" + Console.ReadLine());
                byte[] sdata = Encoding.Default.GetBytes(Console.ReadLine());
                if(Encoding.Default.GetString(sdata) == "QUIT")
                {
                    serverSocket.Send(sdata, sdata.Length, 0);
                    serverSocket.Shutdown(SocketShutdown.Both);
                    serverSocket.Disconnect(true);
                    serverSocket.Close();
                }

                else
                {
                    serverSocket.Send(sdata, 0, sdata.Length, 0);
                }

            }
        }
        catch (Exception e)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(e.Message);
            Console.ForegroundColor = ConsoleColor.White;
        }

    }
}
}

server.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace MessengerConsole
{
class Server
{

    //Server Socket
    static Socket serverSocket;
    //Client Socket
    static Socket clientSocket;

    //Other Variables
    static int port = 8888;
    static IPAddress serverIP;
    static Thread processThread;
    static string username;
    static bool connected = false;
    //Function returns IP Address
    static string GetIp()
    {
        //Computer Name
        string hostname = Dns.GetHostName();

        /*The IPHostEntry class associates a Domain Name System (DNS) host name with an array of aliases and 
         * an array of matching IP addresses.
         */
        IPHostEntry ipentry = Dns.GetHostEntry(hostname);

        //The Address
        IPAddress[] ipAddress = ipentry.AddressList;

        return ipAddress[ipAddress.Length - 1].ToString();
    }

    static void printSession()
    {
        Console.Clear();
        Console.WriteLine("//=====================================================");
        Console.WriteLine("//                       Session Details               ");
        Console.WriteLine("//                    =====================");
        Console.WriteLine("//                    You are hosting the server");
        Console.WriteLine("//                    Time: " + DateTime.Now);
        Console.WriteLine("//=====================================================");
    }
    //Receive
    static void serverReciever()
    {
        while (true)
        {
            Thread.Sleep(500);
            byte[] buffer = new byte[300];
            int rece = clientSocket.Receive(buffer, 0, buffer.Length, 0);
            Array.Resize(ref buffer, rece);

            if (connected == false)
            {
                Console.WriteLine("[" + DateTime.Now.ToString() + "] " + Encoding.Default.GetString(buffer) + " Connected!");
                connected = true;
            }

            else
            {
                if(Encoding.Default.GetString(buffer) == "QUIT")
                {
                    //Quit
                    Console.WriteLine("Client disconnected from the chat");
                    clientSocket.Shutdown(SocketShutdown.Both);
                    clientSocket.Close();
                }
                else
                {
                    Console.WriteLine("[" + DateTime.Now.ToString() + "] " + Encoding.Default.GetString(buffer));
                }

            }
        }
    }



    public static void StartServer()
    {
        //Thread
        processThread = new Thread(serverReciever);

        //Display
        Console.WriteLine("Your Local Ip is " + GetIp());
        Console.WriteLine("Please enter your name");
        username = Console.ReadLine();
        Console.WriteLine("Please enter HostPort");
        //  string portString = Console.ReadLine();
        //temp solution
        string portString = "80";
        try
        {
            port = Convert.ToInt32(portString);
        }
        catch
        {
            port = 8888;
        }

        try
        {
            //GetIp returns string
            serverIP = IPAddress.Parse(GetIp());
            //TCP Socket
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(serverIP, port));
            serverSocket.Listen(0);

            //Server Socket listening for client requests
            clientSocket = serverSocket.Accept();
            printSession();
            processThread.Start();
            byte[] name = Encoding.Default.GetBytes(username);
            clientSocket.Send(name);
            while (true)
            {
                byte[] sdata = Encoding.Default.GetBytes(Console.ReadLine());
                clientSocket.Send(sdata, 0, sdata.Length, 0);
            }
        }
        catch
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Server already open!");
            Console.ForegroundColor = ConsoleColor.White;
        }
    }
}
}

这是我收到的错误

未处理的异常。System.ObjectDisposedException:无法访问已处置的对象。对象名称:“ System.Net.Sockets.Socket”。在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags,SocketError&errorCode)在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小, C:\ Users \ MessengerConsoleAppV2 \ MessengerConsole \ Client.cs:Line 42上MessengerMesole.Client.clientReceiver()处的System.Threading.ThreadHelper.ThreadStart_Context(Object state)在System.Threading.ExecutionContext.RunInternal(ExecutionContext执行上下文,ContextCallback回调,对象状态)---从上一个引发异常的位置开始的堆栈跟踪---在System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext,ContextCallback回调,

我尝试使用Socket.Disconnect(),Socket.Close(),Socket.Dispose(),它们都产生相同的结果

编辑:

添加return

if(Encoding.Default.GetString(sdata) == "QUIT")
            {
                serverSocket.Send(sdata, sdata.Length, 0);
                serverSocket.Shutdown(SocketShutdown.Both);
                serverSocket.Close();
                return;
            }

在服务器端不会导致任何错误,但客户端仍然会抛出正在访问的已处置对象的异常

未处理的异常。System.ObjectDisposedException:无法访问已处置的对象。对象名称:“ System.Net.Sockets.Socket”。在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags,SocketError&errorCode)在System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小, C:\ Users \ MessengerConsoleAppV2 \ MessengerConsole \ Client.cs:Line 44的MessengerConsole.Client.clientReceiver()处的System.Threading.ThreadHelper.ThreadStart_Context(Object state)在System.Threading.ExecutionContext.RunInternal(ExecutionContext执行上下文,ContextCallback回调,对象状态)---从上一个引发异常的位置开始的堆栈跟踪---在System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext,ContextCallback回调,

阿列克谢·鲁缅采夫

在与QUIT相关的所有代码中,仅关闭和配置套接字,而不是从服务于此套接字的无限循环中返回。我认为当Connected在已处置套接字上评估属性时,该堆栈将在下一次迭代时抛出,请return在关闭套接字后尝试添加语句。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

.NET Core 3中的ExecuteSqlRaw参数查询

来自分类Dev

EnableCors C#.NET Core 3

来自分类Dev

SHA1(c#)-与.Net 3和.Net Core不同的结果

来自分类Dev

.NET Core 3中未触发ShouldSerialize方法

来自分类Dev

在.net Core C#中并行校准API调用的最佳方法是什么?

来自分类Dev

Asp .Net Core 3中Challenge的确切含义是什么?

来自分类Dev

如何在.Net Core 3中引用托管服务?

来自分类Dev

.NET Core 3中的日志请求有效负载

来自分类Dev

在.Net Core 3和blazor中捆绑CSS和js

来自分类Dev

.NET Core 3 MVC中的自定义路由

来自分类Dev

删除Net Core 3中的Server:Kestrel标头

来自分类Dev

在asp.net core 3中创建漂亮的url

来自分类Dev

实体框架:更新记录,包括在Net Core 3中

来自分类Dev

覆盖ASP.NET Core 3中的授权策略

来自分类Dev

为什么在.net core 3中删除了Relational()扩展方法?

来自分类Dev

为什么在C#.Net Core 3中连接到MySql时出现错误

来自分类Dev

无法让套接字在 ASP.NET Core 中工作

来自分类Dev

.NET Core中的SOAP?

来自分类Dev

.NET Core中的Ninject

来自分类Dev

.NET Standard和.NET Core 3.x或ASP.NET Core 3.x

来自分类Dev

如何正确处理 ASP.Net Core 3 Web API 中的多个端点

来自分类Dev

.net Core 3身份'AccessFailedCount'不增加

来自分类Dev

.NET Core 3 是否支持 TLS 1.3

来自分类Dev

为什么环境标记在.NET Core 3中不起作用?

来自分类Dev

通过c#.net Core中的套接字连接以消息形式发送图QL查询

来自分类Dev

.NET Core中的Computehash方法

来自分类Dev

WPF控制库的目标是.NET Core 3还是.NET Framework?

来自分类Dev

共享cookie .net Core 3和Asp.net

来自分类Dev

Asp Net core 3的配置是否与Asp Net core 3无关?

Related 相关文章

热门标签

归档