不要在客户端上接收所有数据

时间:2011-05-11 16:20:06

标签: c# sockets asynchronous

  

可能重复:
  C# Begin/EndReceive - how do I read large data?
  C# Async Sockets Server Receive Problems

我有在套接字(TCP)上编写的异步客户端和服务器应用程序。例如,当我从服务器发送300000字节时,我只在客户端收到一部分字节。然后我再次调用Receive方法并接收剩余的数据。虽然Receive方法必须接收所有数据。有什么问题?

这里是客户端Receive方法的代码:

 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 个答案:

没有答案