已建立的连接由主机中的软件中止

时间:2015-11-26 11:19:48

标签: c# sockets connection

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

 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   size,SocketFlags socketFlags)at   System.Net.Sockets.Socket.Receive(Byte [] buffer)\ r \ n at   Client.Form1.uibtnsendmsg_Click(Object sender,EventArgs e)in ...

3 个答案:

答案 0 :(得分:0)

可能是因为你打破了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();
}

为什么要在'broken'循环中创建一个线程?

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

答案 1 :(得分:0)

我不清楚textbox.Start()是做什么的,但在我看来,在服务器从客户端读取一些数据之后,打破了&# 34;而(true)"并关闭套接字连接。 这就是您只能发送一条消息的原因。

Socket handler = listener.Accept();
...
while (true)
{
    .... read data
    textbox.Start();
    break;
}

/* Here you close the connection */
handler.Shutdown(SocketShutdown.Both);
handler.Close();

答案 2 :(得分:0)

我认为你想在同一个套接字上使用持久的tcp连接。

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