【问题标题】:system.net.sockets.socketexception the remote server closed connectionsystem.net.sockets.socketexception 远程服务器关闭连接
【发布时间】:2023-03-25 05:02:01
【问题描述】:

我的服务器端有这段代码。

public static void Data_IN(object cSocket)
{      
    Socket clientSocket = (Socket)cSocket;

    byte[] Buffer;
    int readBytes;

    while (true)
    {                
        Buffer = new byte[clientSocket.SendBufferSize];           
        readBytes = clientSocket.Receive(Buffer);

        if (readBytes > 0)
        {
            Packet p = new Packet(Buffer);
            DataManager(p);
        }
    }
}

主要问题是当我停止调试代码时,服务器总是崩溃并说

System.Net.Sockets.SocketException:远程服务器关闭连接

错误总是在readBytes = clientSocket.Recieve(Buffer)

这是我可以使服务器崩溃的唯一方法,我唯一担心的是,当有人使用我创建的聊天程序并且他/她的计算机崩溃时,聊天服务器将关闭,我总是需要重新启动服务器。

关闭窗口时执行的客户端代码

private void MainWindow_Closed(object sender, EventArgs e)
{
    if (isConnected)
    {
        Packet p = new Packet(PacketType.CloseConnection, ID);

        p.data.Add(login);          
        p.data.Add("exits from chat");

        socket.Send(p.ToBytes());

        socket.Close();
        isConnected = false;
        thread.Abort();
    }
}

下面是使用data_in的代码部分,该代码在客户端

  private void ConnectBtn_Click(object sender, RoutedEventArgs e)
    {
        if (string.IsNullOrWhiteSpace(Login.Text))
        {
            MessageBox.Show("Add username");
        }
        else if (!IPAddress.TryParse(serverIP.Text, out ipAdress))
        {
            MessageBox.Show("Add valid ip");
        }
        else
        {
            ClearRequireMsg();

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipEndPoint = new IPEndPoint(ipAdress, 4242);

            try
            {
                socket.Connect(ipEndPoint);
                login = Login.Text;

                isConnected = true;
                ConnectBtn.IsEnabled = false;
                SendBtn.IsEnabled = true;

                thread = new Thread(Data_IN);
                thread.Start();
            }
            catch (SocketException ex)
            {
                AddMsgToBoard("Error during connecting to server", "System");
            }
        }
    }

【问题讨论】:

  • 显示客户端代码。在服务器开始读取之前,流可能已经在客户端处理
  • @RudreshaParameshappa 我现在将在我关闭窗口时发生的代码广告

标签: c#


【解决方案1】:

您正在调用函数 Data_IN 而不传递任何参数。

thread = new Thread(Data_IN);

正确的方法:

new Thread(() => Data_IN(socket));

【讨论】:

  • 我试过了,现在它给了我一个新的错误; System.ObjectDisposedException: '无法访问已处置的对象。对象名称:System.Net.Sockets.Socket.'
  • System.dll 中发生了“System.ObjectDisposedException”类型的未处理异常,特别是“无法访问已处理的对象”@LoneDev
  • 连接关闭后,clientSocket 对象可能会自动释放。更新您的答案,添加您调用 Data_IN 函数的代码,以便我们为您提供帮助
  • 请稍等,我将其添加到顶部