开发者

Don't Receive all data on Client [duplicate]

开发者 https://www.devze.com 2023-03-04 23:40 出处:网络
This question already has answers here: Closed 11 years ago. Possible Duplicates: C# Begin/EndReceive - how do I read large data?
This question already has answers here: Closed 11 years ago.

Possible Duplicates:

C# Begin/EndReceive - how do I read large data?

C# Async Sockets Server Receive Problems

I have开发者_运维百科 asynchronous client and server applications written on Sockets(TCP). When I send, for example, 300000 bytes from the server, I receive only a part of them on the client. And then I call the Receive method again and receive the rest of the data. Although the Receive method has to receive all the data. What is the problem?

Here the code of the Receive method on client side:

 public class ConnectionInfo
 {
        public Socket _socketReply;
        public Socket _SocketCommand;
        public byte[] _bufferSendReply;
        public byte[] _bufferReceive;
        public byte[] _bufferSendCommand;
        public int _numberBytesSentReply = 0;
        public int _numberBytesSentCommand = 0;
        public List<byte> _fullBufferReceive;
        public uint _id = 0;

        public ConnectionInfo()
        {
            _fullBufferReceive = new List<byte>();
        }
 }

 private void RecieveCallback(IAsyncResult asyncResult)
    {
        ConnectionInfo connection = (ConnectionInfo)asyncResult.AsyncState;
        try
        {
            int bytesRead = connection.Socket.EndReceive(asyncResult);

            if (bytesRead > 0)
            {
                for (int i = 0; i < bytesRead; i++)
                    connection.FullBufferReceive.Add(connection.BufferReceive[i]);
                if (bytesRead == connection.BufferReceive.Length)
                {
                    connection.Socket.BeginReceive(connection.BufferReceive, 0, connection.BufferReceive.Length, 0,
                                                   new AsyncCallback(RecieveCallback), connection);
                    Console.WriteLine("Bytes recieved -- " + bytesRead + " by " + connection.Id);
                }
                else
                {
                    Console.WriteLine("All -- Bytes -- recieved " + bytesRead + " by " + connection.Id);

                    ConnectionInfo NewCI = new ConnectionInfo(connection);
                    Recieve(connection);
                    _serverController.SpreadReceivedData(NewCI);
                }
            }
            else
                CloseConnection(connection);
        }
        catch (ObjectDisposedException ode)
        {
            CloseConnection(connection);
            Console.WriteLine("ObjectDisposedException: " + ode.Message);
        }
        catch (SocketException exc)
        {
            CloseConnection(connection);
            Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
        }
        catch (Exception e)
        {
            CloseConnection(connection);
            Console.WriteLine(e.ToString());
        }
    }

 public void Recieve(ConnectionInfo connection)
 {
        try
        {
            connection.BufferReceive = new byte[Settings.bufferLength];
            connection.FullBufferReceive.Clear();
            connection.NumberBytesSentReply = 0;

            connection.Socket.BeginReceive(connection.BufferReceive, 0, connection.BufferReceive.Length, 0,
                                          new AsyncCallback(RecieveCallback), connection);
        }
        catch (SocketException exc)
        {
            CloseConnection(connection);
            Console.WriteLine("Socket exception: " + exc.SocketErrorCode);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消