【问题标题】:An established connection was aborted by the software in host machine已建立的连接被主机中的软件中止
【发布时间】:2016-02-29 11:18:24
【问题描述】:

我在某些主题中找不到我的答案。 我有一个客户端/服务器代码。 我在单独的程序中有客户端和服务器端。 这是客户端:

 try
        {

        byte[] bytes = new byte[1024];
        string text = "";
        text = uitbtextmsg.Text;
        byte[] msg = Encoding.ASCII.GetBytes(text);
        int bytesSent = User.Send(msg);
        int bytesRec = User.Receive(bytes);

        uirtbmsg.Text = uirtbmsg.Text + '\n' + " " + text;
        }
        catch (Exception E)
        {
            MessageBox.Show(E.ToString());
        }

这是在我连接到服务器并想与该套接字聊天时使用的。 这是我的连接:

            byte[] bytes = new byte[1024];
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[2];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);
            Socket User = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);
            User.Connect(remoteEP);

这是服务器端:

 byte[] bytes = new Byte[1024];
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[2];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
        Socket listener = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp);
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(10000);
            while (true)
            {
                Socket handler = listener.Accept();
                data = null;
                while (true)
                {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
                    TextRecieved = data;
                    Thread textbox = new Thread(new ThreadStart(WriteInReachTextBox));
                    textbox.Start();
                    break;
                }

                //uirtbreport.Text = data;
                byte[] msg = Encoding.ASCII.GetBytes(data);
                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }

        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }

当客户端第一次向服务器发送消息时,这个过程是可以的!但是当它发送另一条消息时,它会抛出一个异常:

System.Net.Socket.SocketException(0x80004005):已建立 主机中的软件在 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags)在 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区)\r\n at Client.Form1.uibtnsendmsg_Click(Object sender, EventArgs e) in ...

【问题讨论】:

    标签: c# sockets connection


    【解决方案1】:

    可能是因为你打破了 while 循环(看我的评论)

    while (true)
    {
        Socket handler = listener.Accept();
        data = null;
    
        while (true)
        {
            bytes = new byte[1024];
            int bytesRec = handler.Receive(bytes);
    
            data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
            TextRecieved = data;
            Thread textbox = new Thread(new ThreadStart(WriteInReachTextBox));
            textbox.Start();
    
            // -----------> HERE!!!!!!
    
            break;
        }
    
        //uirtbreport.Text = data;
        byte[] msg = Encoding.ASCII.GetBytes(data);
        handler.Send(msg);
        handler.Shutdown(SocketShutdown.Both);
        handler.Close();
    }
    

    为什么要在“中断”循环中创建线程?

    另外,不要忘记这是一个流式套接字,这意味着“数据包”可以作为一个缓冲区发送或拆分为多个“数据包”。

    【讨论】:

    • 我正在创建一个线程来打印客户端请求。因为服务器正忙于接受。现在我认为只有一个客户端可以与服务器通话。对吗?
    • 是的,没错。如果你想拥有多个客户端,你应该使用多线程。将 Socket handler = listener.Accept(); 放在一个 while 循环中,并将其结果 (Socket) 传递给开始在该套接字上接收的线程。
    【解决方案2】:

    我不清楚 textbox.Start() 的作用,但在我看来,服务器从客户端读取一些数据后,它中断“while (true)”并关闭套接字连接。 这就是为什么您只能发送一条消息。

    Socket handler = listener.Accept();
    ...
    while (true)
    {
        .... read data
        textbox.Start();
        break;
    }
    
    /* Here you close the connection */
    handler.Shutdown(SocketShutdown.Both);
    handler.Close();
    

    【讨论】:

      【解决方案3】:

      我认为您希望在同一个套接字上建立持久的 tcp 连接。

      只是不要打破循环不要关闭套接字。

      【讨论】:

        猜你喜欢
        • 2012-12-27
        • 2022-01-15
        • 2016-05-15
        • 1970-01-01
        相关资源
        最近更新 更多