Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
466 views
in Technique[技术] by (71.8m points)

c# - Why I am losing bytes in data transfer through sockets in this sample?

I am trying to receive data asynchronously and store it into StringBuilder and when StringBuilder length will be above 1000 process this data. Every time I call my Update_Interface function some data is lost. I set buffer size to 256. How can I solve this? Its caused because my function need some time to process my data and then Client is not receiving data?

 public void Receive(Socket client)
    {

        try
        {
            // Create the state object.  
            StateObject state = new StateObject();
            state.workSocket = client;

            // Begin receiving the data from the remote device.  
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }


    }

    public void ReceiveCallback(IAsyncResult ar)
    {

        try
        {
       

            // Retrieve the state object and the client socket
            // from the asynchronous state object.  
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;

            // Read data from the remote device.  
            int bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                // There might be more data, so store the data received so far.  

                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));


                if (state.sb.Length > 1000)
                {
                    Update_Interface(state.sb.ToString());
                    state.sb.Clear();




                }
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);
            }
            else
            {

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

    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...